LinuxPPC-Dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 21/21] docs: hwmon: Add an index file and rename docs to *.rst
From: Mauro Carvalho Chehab @ 2019-04-10 19:22 UTC (permalink / raw)
  To: Linux Doc Mailing List
  Cc: Mark Rutland, Dirk Eibach, linux-aspeed, devicetree,
	Clemens Ladisch, Kamil Debski, Marc Hulsman, Huang Rui,
	Paul Mackerras, Mauro Carvalho Chehab, Jim Cromie,
	Lorenzo Pieralisi, Jonathan Corbet, Joel Stanley, Guenter Roeck,
	Steve Glendinning, Fenghua Yu, Jean Delvare,
	Bartlomiej Zolnierkiewicz, Liviu Dudau, Mauro Carvalho Chehab,
	Hans de Goede, Rob Herring, Rudolf Marek, linux-arm-kernel,
	linux-hwmon, Support Opensource, George Joseph, Andreas Werner,
	Andrew Jeffery, patches, linux-kernel, Juerg Haefliger,
	Sudeep Holla, linuxppc-dev
In-Reply-To: <cover.1554923967.git.mchehab+samsung@kernel.org>

Now that all files were converted to ReST format, rename them
and add an index.

Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
---
 .../devicetree/bindings/hwmon/g762.txt        |   2 +-
 Documentation/hwmon/{ab8500 => ab8500.rst}    |   2 +-
 ...guru-datasheet => abituguru-datasheet.rst} |   0
 .../hwmon/{abituguru => abituguru.rst}        |   0
 .../hwmon/{abituguru3 => abituguru3.rst}      |   0
 Documentation/hwmon/{abx500 => abx500.rst}    |   0
 ...{acpi_power_meter => acpi_power_meter.rst} |   2 +-
 Documentation/hwmon/{ad7314 => ad7314.rst}    |   0
 .../hwmon/{adc128d818 => adc128d818.rst}      |   0
 Documentation/hwmon/{adm1021 => adm1021.rst}  |   0
 Documentation/hwmon/{adm1025 => adm1025.rst}  |   0
 Documentation/hwmon/{adm1026 => adm1026.rst}  |   0
 Documentation/hwmon/{adm1031 => adm1031.rst}  |   0
 Documentation/hwmon/{adm1275 => adm1275.rst}  |   4 +-
 Documentation/hwmon/{adm9240 => adm9240.rst}  |   0
 Documentation/hwmon/{ads1015 => ads1015.rst}  |   0
 Documentation/hwmon/{ads7828 => ads7828.rst}  |   0
 Documentation/hwmon/{adt7410 => adt7410.rst}  |   0
 Documentation/hwmon/{adt7411 => adt7411.rst}  |   0
 Documentation/hwmon/{adt7462 => adt7462.rst}  |   0
 Documentation/hwmon/{adt7470 => adt7470.rst}  |   0
 Documentation/hwmon/{adt7475 => adt7475.rst}  |   0
 Documentation/hwmon/{amc6821 => amc6821.rst}  |   0
 Documentation/hwmon/{asb100 => asb100.rst}    |   0
 Documentation/hwmon/{asc7621 => asc7621.rst}  |   0
 ...{aspeed-pwm-tacho => aspeed-pwm-tacho.rst} |   0
 .../hwmon/{coretemp => coretemp.rst}          |   0
 Documentation/hwmon/{da9052 => da9052.rst}    |   0
 Documentation/hwmon/{da9055 => da9055.rst}    |   0
 Documentation/hwmon/{dme1737 => dme1737.rst}  |   0
 Documentation/hwmon/{ds1621 => ds1621.rst}    |   0
 Documentation/hwmon/{ds620 => ds620.rst}      |   0
 Documentation/hwmon/{emc1403 => emc1403.rst}  |   0
 Documentation/hwmon/{emc2103 => emc2103.rst}  |   0
 .../hwmon/{emc6w201 => emc6w201.rst}          |   0
 Documentation/hwmon/{f71805f => f71805f.rst}  |   0
 .../hwmon/{f71882fg => f71882fg.rst}          |   0
 .../hwmon/{fam15h_power => fam15h_power.rst}  |   0
 .../hwmon/{ftsteutates => ftsteutates.rst}    |   0
 Documentation/hwmon/{g760a => g760a.rst}      |   0
 Documentation/hwmon/{g762 => g762.rst}        |   2 +-
 Documentation/hwmon/{gl518sm => gl518sm.rst}  |   0
 Documentation/hwmon/{hih6130 => hih6130.rst}  |   0
 ...on-kernel-api.txt => hwmon-kernel-api.rst} |   4 +-
 .../hwmon/{ibm-cffps => ibm-cffps.rst}        |   0
 Documentation/hwmon/{ibmaem => ibmaem.rst}    |   0
 .../hwmon/{ibmpowernv => ibmpowernv.rst}      |   0
 Documentation/hwmon/{ina209 => ina209.rst}    |   0
 Documentation/hwmon/{ina2xx => ina2xx.rst}    |   2 +-
 Documentation/hwmon/{ina3221 => ina3221.rst}  |   0
 Documentation/hwmon/index.rst                 | 179 ++++++++++++++++++
 Documentation/hwmon/{ir35221 => ir35221.rst}  |   0
 Documentation/hwmon/{it87 => it87.rst}        |   0
 Documentation/hwmon/{jc42 => jc42.rst}        |   0
 Documentation/hwmon/{k10temp => k10temp.rst}  |   0
 Documentation/hwmon/{k8temp => k8temp.rst}    |   0
 .../hwmon/{lineage-pem => lineage-pem.rst}    |   0
 Documentation/hwmon/{lm25066 => lm25066.rst}  |   2 +-
 Documentation/hwmon/{lm63 => lm63.rst}        |   0
 Documentation/hwmon/{lm70 => lm70.rst}        |   0
 Documentation/hwmon/{lm73 => lm73.rst}        |   0
 Documentation/hwmon/{lm75 => lm75.rst}        |   0
 Documentation/hwmon/{lm77 => lm77.rst}        |   0
 Documentation/hwmon/{lm78 => lm78.rst}        |   0
 Documentation/hwmon/{lm80 => lm80.rst}        |   0
 Documentation/hwmon/{lm83 => lm83.rst}        |   0
 Documentation/hwmon/{lm85 => lm85.rst}        |   0
 Documentation/hwmon/{lm87 => lm87.rst}        |   0
 Documentation/hwmon/{lm90 => lm90.rst}        |   0
 Documentation/hwmon/{lm92 => lm92.rst}        |   0
 Documentation/hwmon/{lm93 => lm93.rst}        |   0
 Documentation/hwmon/{lm95234 => lm95234.rst}  |   0
 Documentation/hwmon/{lm95245 => lm95245.rst}  |   0
 Documentation/hwmon/{ltc2945 => ltc2945.rst}  |   0
 Documentation/hwmon/{ltc2978 => ltc2978.rst}  |   0
 Documentation/hwmon/{ltc2990 => ltc2990.rst}  |   0
 Documentation/hwmon/{ltc3815 => ltc3815.rst}  |   0
 Documentation/hwmon/{ltc4151 => ltc4151.rst}  |   0
 Documentation/hwmon/{ltc4215 => ltc4215.rst}  |   0
 Documentation/hwmon/{ltc4245 => ltc4245.rst}  |   0
 Documentation/hwmon/{ltc4260 => ltc4260.rst}  |   0
 Documentation/hwmon/{ltc4261 => ltc4261.rst}  |   0
 .../hwmon/{max16064 => max16064.rst}          |   2 +-
 .../hwmon/{max16065 => max16065.rst}          |   0
 Documentation/hwmon/{max1619 => max1619.rst}  |   0
 Documentation/hwmon/{max1668 => max1668.rst}  |   0
 Documentation/hwmon/{max197 => max197.rst}    |   0
 .../hwmon/{max20751 => max20751.rst}          |   2 +-
 .../hwmon/{max31722 => max31722.rst}          |   0
 .../hwmon/{max31785 => max31785.rst}          |   0
 .../hwmon/{max31790 => max31790.rst}          |   0
 .../hwmon/{max34440 => max34440.rst}          |   2 +-
 Documentation/hwmon/{max6639 => max6639.rst}  |   0
 Documentation/hwmon/{max6642 => max6642.rst}  |   0
 Documentation/hwmon/{max6650 => max6650.rst}  |   0
 Documentation/hwmon/{max6697 => max6697.rst}  |   0
 Documentation/hwmon/{max8688 => max8688.rst}  |   2 +-
 .../hwmon/{mc13783-adc => mc13783-adc.rst}    |   0
 Documentation/hwmon/{mcp3021 => mcp3021.rst}  |   0
 .../hwmon/{menf21bmc => menf21bmc.rst}        |   0
 .../hwmon/{mlxreg-fan => mlxreg-fan.rst}      |   0
 Documentation/hwmon/{nct6683 => nct6683.rst}  |   0
 Documentation/hwmon/{nct6775 => nct6775.rst}  |   0
 Documentation/hwmon/{nct7802 => nct7802.rst}  |   0
 Documentation/hwmon/{nct7904 => nct7904.rst}  |   0
 .../{npcm750-pwm-fan => npcm750-pwm-fan.rst}  |   0
 Documentation/hwmon/{nsa320 => nsa320.rst}    |   0
 .../{ntc_thermistor => ntc_thermistor.rst}    |   0
 Documentation/hwmon/{occ => occ.rst}          |   0
 Documentation/hwmon/{pc87360 => pc87360.rst}  |   0
 Documentation/hwmon/{pc87427 => pc87427.rst}  |   0
 Documentation/hwmon/{pcf8591 => pcf8591.rst}  |   0
 .../hwmon/{pmbus-core => pmbus-core.rst}      |   0
 Documentation/hwmon/{pmbus => pmbus.rst}      |   0
 .../hwmon/{powr1220 => powr1220.rst}          |   0
 Documentation/hwmon/{pwm-fan => pwm-fan.rst}  |   0
 ...aspberrypi-hwmon => raspberrypi-hwmon.rst} |   0
 Documentation/hwmon/{sch5627 => sch5627.rst}  |   0
 Documentation/hwmon/{sch5636 => sch5636.rst}  |   0
 .../hwmon/{scpi-hwmon => scpi-hwmon.rst}      |   0
 Documentation/hwmon/{sht15 => sht15.rst}      |   0
 Documentation/hwmon/{sht21 => sht21.rst}      |   0
 Documentation/hwmon/{sht3x => sht3x.rst}      |   0
 Documentation/hwmon/{shtc1 => shtc1.rst}      |   0
 Documentation/hwmon/{sis5595 => sis5595.rst}  |   0
 Documentation/hwmon/{smm665 => smm665.rst}    |   0
 .../hwmon/{smsc47b397 => smsc47b397.rst}      |   0
 .../hwmon/{smsc47m1 => smsc47m1.rst}          |   0
 .../hwmon/{smsc47m192 => smsc47m192.rst}      |   0
 ...mitting-patches => submitting-patches.rst} |   6 +-
 .../{sysfs-interface => sysfs-interface.rst}  |   0
 Documentation/hwmon/{tc654 => tc654.rst}      |   0
 Documentation/hwmon/{tc74 => tc74.rst}        |   0
 Documentation/hwmon/{thmc50 => thmc50.rst}    |   0
 Documentation/hwmon/{tmp102 => tmp102.rst}    |   2 +-
 Documentation/hwmon/{tmp103 => tmp103.rst}    |   2 +-
 Documentation/hwmon/{tmp108 => tmp108.rst}    |   2 +-
 Documentation/hwmon/{tmp401 => tmp401.rst}    |   2 +-
 Documentation/hwmon/{tmp421 => tmp421.rst}    |   0
 .../hwmon/{tps40422 => tps40422.rst}          |   2 +-
 ...4030-madc-hwmon => twl4030-madc-hwmon.rst} |   0
 Documentation/hwmon/{ucd9000 => ucd9000.rst}  |   4 +-
 Documentation/hwmon/{ucd9200 => ucd9200.rst}  |   4 +-
 .../{userspace-tools => userspace-tools.rst}  |   0
 .../hwmon/{vexpress => vexpress.rst}          |   0
 Documentation/hwmon/{via686a => via686a.rst}  |   0
 Documentation/hwmon/{vt1211 => vt1211.rst}    |   0
 .../hwmon/{w83627ehf => w83627ehf.rst}        |   0
 .../hwmon/{w83627hf => w83627hf.rst}          |   0
 Documentation/hwmon/{w83773g => w83773g.rst}  |   0
 Documentation/hwmon/{w83781d => w83781d.rst}  |   0
 Documentation/hwmon/{w83791d => w83791d.rst}  |   2 +-
 Documentation/hwmon/{w83792d => w83792d.rst}  |   0
 Documentation/hwmon/{w83793 => w83793.rst}    |   0
 Documentation/hwmon/{w83795 => w83795.rst}    |   0
 .../hwmon/{w83l785ts => w83l785ts.rst}        |   0
 .../hwmon/{w83l786ng => w83l786ng.rst}        |   0
 Documentation/hwmon/{wm831x => wm831x.rst}    |   0
 Documentation/hwmon/{wm8350 => wm8350.rst}    |   0
 .../hwmon/{xgene-hwmon => xgene-hwmon.rst}    |   0
 Documentation/hwmon/{zl6100 => zl6100.rst}    |   2 +-
 Documentation/index.rst                       |   1 +
 Documentation/thermal/sysfs-api.txt           |   2 +-
 MAINTAINERS                                   | 108 +++++------
 drivers/hwmon/Kconfig                         |   8 +-
 drivers/hwmon/ads7828.c                       |   2 +-
 drivers/hwmon/max197.c                        |   2 +-
 drivers/hwmon/sht15.c                         |   2 +-
 include/linux/platform_data/ads7828.h         |   2 +-
 include/linux/platform_data/ds620.h           |   2 +-
 include/linux/platform_data/ina2xx.h          |   2 +-
 include/linux/platform_data/max197.h          |   2 +-
 include/linux/platform_data/ntc_thermistor.h  |   2 +-
 173 files changed, 275 insertions(+), 95 deletions(-)
 rename Documentation/hwmon/{ab8500 => ab8500.rst} (86%)
 rename Documentation/hwmon/{abituguru-datasheet => abituguru-datasheet.rst} (100%)
 rename Documentation/hwmon/{abituguru => abituguru.rst} (100%)
 rename Documentation/hwmon/{abituguru3 => abituguru3.rst} (100%)
 rename Documentation/hwmon/{abx500 => abx500.rst} (100%)
 rename Documentation/hwmon/{acpi_power_meter => acpi_power_meter.rst} (97%)
 rename Documentation/hwmon/{ad7314 => ad7314.rst} (100%)
 rename Documentation/hwmon/{adc128d818 => adc128d818.rst} (100%)
 rename Documentation/hwmon/{adm1021 => adm1021.rst} (100%)
 rename Documentation/hwmon/{adm1025 => adm1025.rst} (100%)
 rename Documentation/hwmon/{adm1026 => adm1026.rst} (100%)
 rename Documentation/hwmon/{adm1031 => adm1031.rst} (100%)
 rename Documentation/hwmon/{adm1275 => adm1275.rst} (97%)
 rename Documentation/hwmon/{adm9240 => adm9240.rst} (100%)
 rename Documentation/hwmon/{ads1015 => ads1015.rst} (100%)
 rename Documentation/hwmon/{ads7828 => ads7828.rst} (100%)
 rename Documentation/hwmon/{adt7410 => adt7410.rst} (100%)
 rename Documentation/hwmon/{adt7411 => adt7411.rst} (100%)
 rename Documentation/hwmon/{adt7462 => adt7462.rst} (100%)
 rename Documentation/hwmon/{adt7470 => adt7470.rst} (100%)
 rename Documentation/hwmon/{adt7475 => adt7475.rst} (100%)
 rename Documentation/hwmon/{amc6821 => amc6821.rst} (100%)
 rename Documentation/hwmon/{asb100 => asb100.rst} (100%)
 rename Documentation/hwmon/{asc7621 => asc7621.rst} (100%)
 rename Documentation/hwmon/{aspeed-pwm-tacho => aspeed-pwm-tacho.rst} (100%)
 rename Documentation/hwmon/{coretemp => coretemp.rst} (100%)
 rename Documentation/hwmon/{da9052 => da9052.rst} (100%)
 rename Documentation/hwmon/{da9055 => da9055.rst} (100%)
 rename Documentation/hwmon/{dme1737 => dme1737.rst} (100%)
 rename Documentation/hwmon/{ds1621 => ds1621.rst} (100%)
 rename Documentation/hwmon/{ds620 => ds620.rst} (100%)
 rename Documentation/hwmon/{emc1403 => emc1403.rst} (100%)
 rename Documentation/hwmon/{emc2103 => emc2103.rst} (100%)
 rename Documentation/hwmon/{emc6w201 => emc6w201.rst} (100%)
 rename Documentation/hwmon/{f71805f => f71805f.rst} (100%)
 rename Documentation/hwmon/{f71882fg => f71882fg.rst} (100%)
 rename Documentation/hwmon/{fam15h_power => fam15h_power.rst} (100%)
 rename Documentation/hwmon/{ftsteutates => ftsteutates.rst} (100%)
 rename Documentation/hwmon/{g760a => g760a.rst} (100%)
 rename Documentation/hwmon/{g762 => g762.rst} (97%)
 rename Documentation/hwmon/{gl518sm => gl518sm.rst} (100%)
 rename Documentation/hwmon/{hih6130 => hih6130.rst} (100%)
 rename Documentation/hwmon/{hwmon-kernel-api.txt => hwmon-kernel-api.rst} (99%)
 rename Documentation/hwmon/{ibm-cffps => ibm-cffps.rst} (100%)
 rename Documentation/hwmon/{ibmaem => ibmaem.rst} (100%)
 rename Documentation/hwmon/{ibmpowernv => ibmpowernv.rst} (100%)
 rename Documentation/hwmon/{ina209 => ina209.rst} (100%)
 rename Documentation/hwmon/{ina2xx => ina2xx.rst} (97%)
 rename Documentation/hwmon/{ina3221 => ina3221.rst} (100%)
 create mode 100644 Documentation/hwmon/index.rst
 rename Documentation/hwmon/{ir35221 => ir35221.rst} (100%)
 rename Documentation/hwmon/{it87 => it87.rst} (100%)
 rename Documentation/hwmon/{jc42 => jc42.rst} (100%)
 rename Documentation/hwmon/{k10temp => k10temp.rst} (100%)
 rename Documentation/hwmon/{k8temp => k8temp.rst} (100%)
 rename Documentation/hwmon/{lineage-pem => lineage-pem.rst} (100%)
 rename Documentation/hwmon/{lm25066 => lm25066.rst} (97%)
 rename Documentation/hwmon/{lm63 => lm63.rst} (100%)
 rename Documentation/hwmon/{lm70 => lm70.rst} (100%)
 rename Documentation/hwmon/{lm73 => lm73.rst} (100%)
 rename Documentation/hwmon/{lm75 => lm75.rst} (100%)
 rename Documentation/hwmon/{lm77 => lm77.rst} (100%)
 rename Documentation/hwmon/{lm78 => lm78.rst} (100%)
 rename Documentation/hwmon/{lm80 => lm80.rst} (100%)
 rename Documentation/hwmon/{lm83 => lm83.rst} (100%)
 rename Documentation/hwmon/{lm85 => lm85.rst} (100%)
 rename Documentation/hwmon/{lm87 => lm87.rst} (100%)
 rename Documentation/hwmon/{lm90 => lm90.rst} (100%)
 rename Documentation/hwmon/{lm92 => lm92.rst} (100%)
 rename Documentation/hwmon/{lm93 => lm93.rst} (100%)
 rename Documentation/hwmon/{lm95234 => lm95234.rst} (100%)
 rename Documentation/hwmon/{lm95245 => lm95245.rst} (100%)
 rename Documentation/hwmon/{ltc2945 => ltc2945.rst} (100%)
 rename Documentation/hwmon/{ltc2978 => ltc2978.rst} (100%)
 rename Documentation/hwmon/{ltc2990 => ltc2990.rst} (100%)
 rename Documentation/hwmon/{ltc3815 => ltc3815.rst} (100%)
 rename Documentation/hwmon/{ltc4151 => ltc4151.rst} (100%)
 rename Documentation/hwmon/{ltc4215 => ltc4215.rst} (100%)
 rename Documentation/hwmon/{ltc4245 => ltc4245.rst} (100%)
 rename Documentation/hwmon/{ltc4260 => ltc4260.rst} (100%)
 rename Documentation/hwmon/{ltc4261 => ltc4261.rst} (100%)
 rename Documentation/hwmon/{max16064 => max16064.rst} (96%)
 rename Documentation/hwmon/{max16065 => max16065.rst} (100%)
 rename Documentation/hwmon/{max1619 => max1619.rst} (100%)
 rename Documentation/hwmon/{max1668 => max1668.rst} (100%)
 rename Documentation/hwmon/{max197 => max197.rst} (100%)
 rename Documentation/hwmon/{max20751 => max20751.rst} (96%)
 rename Documentation/hwmon/{max31722 => max31722.rst} (100%)
 rename Documentation/hwmon/{max31785 => max31785.rst} (100%)
 rename Documentation/hwmon/{max31790 => max31790.rst} (100%)
 rename Documentation/hwmon/{max34440 => max34440.rst} (98%)
 rename Documentation/hwmon/{max6639 => max6639.rst} (100%)
 rename Documentation/hwmon/{max6642 => max6642.rst} (100%)
 rename Documentation/hwmon/{max6650 => max6650.rst} (100%)
 rename Documentation/hwmon/{max6697 => max6697.rst} (100%)
 rename Documentation/hwmon/{max8688 => max8688.rst} (97%)
 rename Documentation/hwmon/{mc13783-adc => mc13783-adc.rst} (100%)
 rename Documentation/hwmon/{mcp3021 => mcp3021.rst} (100%)
 rename Documentation/hwmon/{menf21bmc => menf21bmc.rst} (100%)
 rename Documentation/hwmon/{mlxreg-fan => mlxreg-fan.rst} (100%)
 rename Documentation/hwmon/{nct6683 => nct6683.rst} (100%)
 rename Documentation/hwmon/{nct6775 => nct6775.rst} (100%)
 rename Documentation/hwmon/{nct7802 => nct7802.rst} (100%)
 rename Documentation/hwmon/{nct7904 => nct7904.rst} (100%)
 rename Documentation/hwmon/{npcm750-pwm-fan => npcm750-pwm-fan.rst} (100%)
 rename Documentation/hwmon/{nsa320 => nsa320.rst} (100%)
 rename Documentation/hwmon/{ntc_thermistor => ntc_thermistor.rst} (100%)
 rename Documentation/hwmon/{occ => occ.rst} (100%)
 rename Documentation/hwmon/{pc87360 => pc87360.rst} (100%)
 rename Documentation/hwmon/{pc87427 => pc87427.rst} (100%)
 rename Documentation/hwmon/{pcf8591 => pcf8591.rst} (100%)
 rename Documentation/hwmon/{pmbus-core => pmbus-core.rst} (100%)
 rename Documentation/hwmon/{pmbus => pmbus.rst} (100%)
 rename Documentation/hwmon/{powr1220 => powr1220.rst} (100%)
 rename Documentation/hwmon/{pwm-fan => pwm-fan.rst} (100%)
 rename Documentation/hwmon/{raspberrypi-hwmon => raspberrypi-hwmon.rst} (100%)
 rename Documentation/hwmon/{sch5627 => sch5627.rst} (100%)
 rename Documentation/hwmon/{sch5636 => sch5636.rst} (100%)
 rename Documentation/hwmon/{scpi-hwmon => scpi-hwmon.rst} (100%)
 rename Documentation/hwmon/{sht15 => sht15.rst} (100%)
 rename Documentation/hwmon/{sht21 => sht21.rst} (100%)
 rename Documentation/hwmon/{sht3x => sht3x.rst} (100%)
 rename Documentation/hwmon/{shtc1 => shtc1.rst} (100%)
 rename Documentation/hwmon/{sis5595 => sis5595.rst} (100%)
 rename Documentation/hwmon/{smm665 => smm665.rst} (100%)
 rename Documentation/hwmon/{smsc47b397 => smsc47b397.rst} (100%)
 rename Documentation/hwmon/{smsc47m1 => smsc47m1.rst} (100%)
 rename Documentation/hwmon/{smsc47m192 => smsc47m192.rst} (100%)
 rename Documentation/hwmon/{submitting-patches => submitting-patches.rst} (98%)
 rename Documentation/hwmon/{sysfs-interface => sysfs-interface.rst} (100%)
 rename Documentation/hwmon/{tc654 => tc654.rst} (100%)
 rename Documentation/hwmon/{tc74 => tc74.rst} (100%)
 rename Documentation/hwmon/{thmc50 => thmc50.rst} (100%)
 rename Documentation/hwmon/{tmp102 => tmp102.rst} (93%)
 rename Documentation/hwmon/{tmp103 => tmp103.rst} (92%)
 rename Documentation/hwmon/{tmp108 => tmp108.rst} (95%)
 rename Documentation/hwmon/{tmp401 => tmp401.rst} (97%)
 rename Documentation/hwmon/{tmp421 => tmp421.rst} (100%)
 rename Documentation/hwmon/{tps40422 => tps40422.rst} (96%)
 rename Documentation/hwmon/{twl4030-madc-hwmon => twl4030-madc-hwmon.rst} (100%)
 rename Documentation/hwmon/{ucd9000 => ucd9000.rst} (97%)
 rename Documentation/hwmon/{ucd9200 => ucd9200.rst} (97%)
 rename Documentation/hwmon/{userspace-tools => userspace-tools.rst} (100%)
 rename Documentation/hwmon/{vexpress => vexpress.rst} (100%)
 rename Documentation/hwmon/{via686a => via686a.rst} (100%)
 rename Documentation/hwmon/{vt1211 => vt1211.rst} (100%)
 rename Documentation/hwmon/{w83627ehf => w83627ehf.rst} (100%)
 rename Documentation/hwmon/{w83627hf => w83627hf.rst} (100%)
 rename Documentation/hwmon/{w83773g => w83773g.rst} (100%)
 rename Documentation/hwmon/{w83781d => w83781d.rst} (100%)
 rename Documentation/hwmon/{w83791d => w83791d.rst} (99%)
 rename Documentation/hwmon/{w83792d => w83792d.rst} (100%)
 rename Documentation/hwmon/{w83793 => w83793.rst} (100%)
 rename Documentation/hwmon/{w83795 => w83795.rst} (100%)
 rename Documentation/hwmon/{w83l785ts => w83l785ts.rst} (100%)
 rename Documentation/hwmon/{w83l786ng => w83l786ng.rst} (100%)
 rename Documentation/hwmon/{wm831x => wm831x.rst} (100%)
 rename Documentation/hwmon/{wm8350 => wm8350.rst} (100%)
 rename Documentation/hwmon/{xgene-hwmon => xgene-hwmon.rst} (100%)
 rename Documentation/hwmon/{zl6100 => zl6100.rst} (98%)

diff --git a/Documentation/devicetree/bindings/hwmon/g762.txt b/Documentation/devicetree/bindings/hwmon/g762.txt
index 25cc6d8ee575..6d154c4923de 100644
--- a/Documentation/devicetree/bindings/hwmon/g762.txt
+++ b/Documentation/devicetree/bindings/hwmon/g762.txt
@@ -21,7 +21,7 @@ If an optional property is not set in .dts file, then current value is kept
 unmodified (e.g. u-boot installed value).
 
 Additional information on operational parameters for the device is available
-in Documentation/hwmon/g762. A detailed datasheet for the device is available
+in Documentation/hwmon/g762.rst. A detailed datasheet for the device is available
 at http://natisbad.org/NAS/refs/GMT_EDS-762_763-080710-0.2.pdf.
 
 Example g762 node:
diff --git a/Documentation/hwmon/ab8500 b/Documentation/hwmon/ab8500.rst
similarity index 86%
rename from Documentation/hwmon/ab8500
rename to Documentation/hwmon/ab8500.rst
index d87c61151239..33f93a9cec04 100644
--- a/Documentation/hwmon/ab8500
+++ b/Documentation/hwmon/ab8500.rst
@@ -18,7 +18,7 @@ Authors:
 Description
 -----------
 
-See also Documentation/hwmon/abx500. This is the ST-Ericsson AB8500 specific
+See also Documentation/hwmon/abx500.rst. This is the ST-Ericsson AB8500 specific
 driver.
 
 Currently only the AB8500 internal sensor and one external sensor for battery
diff --git a/Documentation/hwmon/abituguru-datasheet b/Documentation/hwmon/abituguru-datasheet.rst
similarity index 100%
rename from Documentation/hwmon/abituguru-datasheet
rename to Documentation/hwmon/abituguru-datasheet.rst
diff --git a/Documentation/hwmon/abituguru b/Documentation/hwmon/abituguru.rst
similarity index 100%
rename from Documentation/hwmon/abituguru
rename to Documentation/hwmon/abituguru.rst
diff --git a/Documentation/hwmon/abituguru3 b/Documentation/hwmon/abituguru3.rst
similarity index 100%
rename from Documentation/hwmon/abituguru3
rename to Documentation/hwmon/abituguru3.rst
diff --git a/Documentation/hwmon/abx500 b/Documentation/hwmon/abx500.rst
similarity index 100%
rename from Documentation/hwmon/abx500
rename to Documentation/hwmon/abx500.rst
diff --git a/Documentation/hwmon/acpi_power_meter b/Documentation/hwmon/acpi_power_meter.rst
similarity index 97%
rename from Documentation/hwmon/acpi_power_meter
rename to Documentation/hwmon/acpi_power_meter.rst
index 7665ca6ba957..4a0941ade0ca 100644
--- a/Documentation/hwmon/acpi_power_meter
+++ b/Documentation/hwmon/acpi_power_meter.rst
@@ -21,7 +21,7 @@ the ACPI 4.0 spec (Chapter 10.4).  These devices have a simple set of
 features--a power meter that returns average power use over a configurable
 interval, an optional capping mechanism, and a couple of trip points.  The
 sysfs interface conforms with the specification outlined in the "Power" section
-of Documentation/hwmon/sysfs-interface.
+of Documentation/hwmon/sysfs-interface.rst.
 
 Special Features
 ----------------
diff --git a/Documentation/hwmon/ad7314 b/Documentation/hwmon/ad7314.rst
similarity index 100%
rename from Documentation/hwmon/ad7314
rename to Documentation/hwmon/ad7314.rst
diff --git a/Documentation/hwmon/adc128d818 b/Documentation/hwmon/adc128d818.rst
similarity index 100%
rename from Documentation/hwmon/adc128d818
rename to Documentation/hwmon/adc128d818.rst
diff --git a/Documentation/hwmon/adm1021 b/Documentation/hwmon/adm1021.rst
similarity index 100%
rename from Documentation/hwmon/adm1021
rename to Documentation/hwmon/adm1021.rst
diff --git a/Documentation/hwmon/adm1025 b/Documentation/hwmon/adm1025.rst
similarity index 100%
rename from Documentation/hwmon/adm1025
rename to Documentation/hwmon/adm1025.rst
diff --git a/Documentation/hwmon/adm1026 b/Documentation/hwmon/adm1026.rst
similarity index 100%
rename from Documentation/hwmon/adm1026
rename to Documentation/hwmon/adm1026.rst
diff --git a/Documentation/hwmon/adm1031 b/Documentation/hwmon/adm1031.rst
similarity index 100%
rename from Documentation/hwmon/adm1031
rename to Documentation/hwmon/adm1031.rst
diff --git a/Documentation/hwmon/adm1275 b/Documentation/hwmon/adm1275.rst
similarity index 97%
rename from Documentation/hwmon/adm1275
rename to Documentation/hwmon/adm1275.rst
index 5c5860011d6e..9a1913e5b4d9 100644
--- a/Documentation/hwmon/adm1275
+++ b/Documentation/hwmon/adm1275.rst
@@ -68,7 +68,7 @@ integrated 12 bit analog-to-digital converter (ADC), accessed using a
 PMBus interface.
 
 The driver is a client driver to the core PMBus driver. Please see
-Documentation/hwmon/pmbus for details on PMBus client drivers.
+Documentation/hwmon/pmbus.rst for details on PMBus client drivers.
 
 
 Usage Notes
@@ -90,7 +90,7 @@ Platform data support
 ---------------------
 
 The driver supports standard PMBus driver platform data. Please see
-Documentation/hwmon/pmbus for details.
+Documentation/hwmon/pmbus.rst for details.
 
 
 Sysfs entries
diff --git a/Documentation/hwmon/adm9240 b/Documentation/hwmon/adm9240.rst
similarity index 100%
rename from Documentation/hwmon/adm9240
rename to Documentation/hwmon/adm9240.rst
diff --git a/Documentation/hwmon/ads1015 b/Documentation/hwmon/ads1015.rst
similarity index 100%
rename from Documentation/hwmon/ads1015
rename to Documentation/hwmon/ads1015.rst
diff --git a/Documentation/hwmon/ads7828 b/Documentation/hwmon/ads7828.rst
similarity index 100%
rename from Documentation/hwmon/ads7828
rename to Documentation/hwmon/ads7828.rst
diff --git a/Documentation/hwmon/adt7410 b/Documentation/hwmon/adt7410.rst
similarity index 100%
rename from Documentation/hwmon/adt7410
rename to Documentation/hwmon/adt7410.rst
diff --git a/Documentation/hwmon/adt7411 b/Documentation/hwmon/adt7411.rst
similarity index 100%
rename from Documentation/hwmon/adt7411
rename to Documentation/hwmon/adt7411.rst
diff --git a/Documentation/hwmon/adt7462 b/Documentation/hwmon/adt7462.rst
similarity index 100%
rename from Documentation/hwmon/adt7462
rename to Documentation/hwmon/adt7462.rst
diff --git a/Documentation/hwmon/adt7470 b/Documentation/hwmon/adt7470.rst
similarity index 100%
rename from Documentation/hwmon/adt7470
rename to Documentation/hwmon/adt7470.rst
diff --git a/Documentation/hwmon/adt7475 b/Documentation/hwmon/adt7475.rst
similarity index 100%
rename from Documentation/hwmon/adt7475
rename to Documentation/hwmon/adt7475.rst
diff --git a/Documentation/hwmon/amc6821 b/Documentation/hwmon/amc6821.rst
similarity index 100%
rename from Documentation/hwmon/amc6821
rename to Documentation/hwmon/amc6821.rst
diff --git a/Documentation/hwmon/asb100 b/Documentation/hwmon/asb100.rst
similarity index 100%
rename from Documentation/hwmon/asb100
rename to Documentation/hwmon/asb100.rst
diff --git a/Documentation/hwmon/asc7621 b/Documentation/hwmon/asc7621.rst
similarity index 100%
rename from Documentation/hwmon/asc7621
rename to Documentation/hwmon/asc7621.rst
diff --git a/Documentation/hwmon/aspeed-pwm-tacho b/Documentation/hwmon/aspeed-pwm-tacho.rst
similarity index 100%
rename from Documentation/hwmon/aspeed-pwm-tacho
rename to Documentation/hwmon/aspeed-pwm-tacho.rst
diff --git a/Documentation/hwmon/coretemp b/Documentation/hwmon/coretemp.rst
similarity index 100%
rename from Documentation/hwmon/coretemp
rename to Documentation/hwmon/coretemp.rst
diff --git a/Documentation/hwmon/da9052 b/Documentation/hwmon/da9052.rst
similarity index 100%
rename from Documentation/hwmon/da9052
rename to Documentation/hwmon/da9052.rst
diff --git a/Documentation/hwmon/da9055 b/Documentation/hwmon/da9055.rst
similarity index 100%
rename from Documentation/hwmon/da9055
rename to Documentation/hwmon/da9055.rst
diff --git a/Documentation/hwmon/dme1737 b/Documentation/hwmon/dme1737.rst
similarity index 100%
rename from Documentation/hwmon/dme1737
rename to Documentation/hwmon/dme1737.rst
diff --git a/Documentation/hwmon/ds1621 b/Documentation/hwmon/ds1621.rst
similarity index 100%
rename from Documentation/hwmon/ds1621
rename to Documentation/hwmon/ds1621.rst
diff --git a/Documentation/hwmon/ds620 b/Documentation/hwmon/ds620.rst
similarity index 100%
rename from Documentation/hwmon/ds620
rename to Documentation/hwmon/ds620.rst
diff --git a/Documentation/hwmon/emc1403 b/Documentation/hwmon/emc1403.rst
similarity index 100%
rename from Documentation/hwmon/emc1403
rename to Documentation/hwmon/emc1403.rst
diff --git a/Documentation/hwmon/emc2103 b/Documentation/hwmon/emc2103.rst
similarity index 100%
rename from Documentation/hwmon/emc2103
rename to Documentation/hwmon/emc2103.rst
diff --git a/Documentation/hwmon/emc6w201 b/Documentation/hwmon/emc6w201.rst
similarity index 100%
rename from Documentation/hwmon/emc6w201
rename to Documentation/hwmon/emc6w201.rst
diff --git a/Documentation/hwmon/f71805f b/Documentation/hwmon/f71805f.rst
similarity index 100%
rename from Documentation/hwmon/f71805f
rename to Documentation/hwmon/f71805f.rst
diff --git a/Documentation/hwmon/f71882fg b/Documentation/hwmon/f71882fg.rst
similarity index 100%
rename from Documentation/hwmon/f71882fg
rename to Documentation/hwmon/f71882fg.rst
diff --git a/Documentation/hwmon/fam15h_power b/Documentation/hwmon/fam15h_power.rst
similarity index 100%
rename from Documentation/hwmon/fam15h_power
rename to Documentation/hwmon/fam15h_power.rst
diff --git a/Documentation/hwmon/ftsteutates b/Documentation/hwmon/ftsteutates.rst
similarity index 100%
rename from Documentation/hwmon/ftsteutates
rename to Documentation/hwmon/ftsteutates.rst
diff --git a/Documentation/hwmon/g760a b/Documentation/hwmon/g760a.rst
similarity index 100%
rename from Documentation/hwmon/g760a
rename to Documentation/hwmon/g760a.rst
diff --git a/Documentation/hwmon/g762 b/Documentation/hwmon/g762.rst
similarity index 97%
rename from Documentation/hwmon/g762
rename to Documentation/hwmon/g762.rst
index 54574e26df21..0371b3365c48 100644
--- a/Documentation/hwmon/g762
+++ b/Documentation/hwmon/g762.rst
@@ -7,7 +7,7 @@ modes - PWM or DC - are supported by the device.
 
 For additional information, a detailed datasheet is available at
 http://natisbad.org/NAS/ref/GMT_EDS-762_763-080710-0.2.pdf. sysfs
-bindings are described in Documentation/hwmon/sysfs-interface.
+bindings are described in Documentation/hwmon/sysfs-interface.rst.
 
 The following entries are available to the user in a subdirectory of
 /sys/bus/i2c/drivers/g762/ to control the operation of the device.
diff --git a/Documentation/hwmon/gl518sm b/Documentation/hwmon/gl518sm.rst
similarity index 100%
rename from Documentation/hwmon/gl518sm
rename to Documentation/hwmon/gl518sm.rst
diff --git a/Documentation/hwmon/hih6130 b/Documentation/hwmon/hih6130.rst
similarity index 100%
rename from Documentation/hwmon/hih6130
rename to Documentation/hwmon/hih6130.rst
diff --git a/Documentation/hwmon/hwmon-kernel-api.txt b/Documentation/hwmon/hwmon-kernel-api.rst
similarity index 99%
rename from Documentation/hwmon/hwmon-kernel-api.txt
rename to Documentation/hwmon/hwmon-kernel-api.rst
index b56343f5c2c4..5766bee64153 100644
--- a/Documentation/hwmon/hwmon-kernel-api.txt
+++ b/Documentation/hwmon/hwmon-kernel-api.rst
@@ -12,10 +12,10 @@ drivers that want to use the hardware monitoring framework.
 This document does not describe what a hardware monitoring (hwmon) Driver or
 Device is. It also does not describe the API which can be used by user space
 to communicate with a hardware monitoring device. If you want to know this
-then please read the following file: Documentation/hwmon/sysfs-interface.
+then please read the following file: Documentation/hwmon/sysfs-interface.rst.
 
 For additional guidelines on how to write and improve hwmon drivers, please
-also read Documentation/hwmon/submitting-patches.
+also read Documentation/hwmon/submitting-patches.rst.
 
 The API
 -------
diff --git a/Documentation/hwmon/ibm-cffps b/Documentation/hwmon/ibm-cffps.rst
similarity index 100%
rename from Documentation/hwmon/ibm-cffps
rename to Documentation/hwmon/ibm-cffps.rst
diff --git a/Documentation/hwmon/ibmaem b/Documentation/hwmon/ibmaem.rst
similarity index 100%
rename from Documentation/hwmon/ibmaem
rename to Documentation/hwmon/ibmaem.rst
diff --git a/Documentation/hwmon/ibmpowernv b/Documentation/hwmon/ibmpowernv.rst
similarity index 100%
rename from Documentation/hwmon/ibmpowernv
rename to Documentation/hwmon/ibmpowernv.rst
diff --git a/Documentation/hwmon/ina209 b/Documentation/hwmon/ina209.rst
similarity index 100%
rename from Documentation/hwmon/ina209
rename to Documentation/hwmon/ina209.rst
diff --git a/Documentation/hwmon/ina2xx b/Documentation/hwmon/ina2xx.rst
similarity index 97%
rename from Documentation/hwmon/ina2xx
rename to Documentation/hwmon/ina2xx.rst
index 95badf9c396f..94b9a260c518 100644
--- a/Documentation/hwmon/ina2xx
+++ b/Documentation/hwmon/ina2xx.rst
@@ -78,7 +78,7 @@ refer to the Documentation/devicetree/bindings/hwmon/ina2xx.txt for bindings
 if the device tree is used.
 
 Additionally ina226 supports update_interval attribute as described in
-Documentation/hwmon/sysfs-interface. Internally the interval is the sum of
+Documentation/hwmon/sysfs-interface.rst. Internally the interval is the sum of
 bus and shunt voltage conversion times multiplied by the averaging rate. We
 don't touch the conversion times and only modify the number of averages. The
 lower limit of the update_interval is 2 ms, the upper limit is 2253 ms.
diff --git a/Documentation/hwmon/ina3221 b/Documentation/hwmon/ina3221.rst
similarity index 100%
rename from Documentation/hwmon/ina3221
rename to Documentation/hwmon/ina3221.rst
diff --git a/Documentation/hwmon/index.rst b/Documentation/hwmon/index.rst
new file mode 100644
index 000000000000..893804414510
--- /dev/null
+++ b/Documentation/hwmon/index.rst
@@ -0,0 +1,179 @@
+=========================
+Linux Hardware Monitoring
+=========================
+
+.. toctree::
+   :maxdepth: 1
+
+   hwmon-kernel-api.rst
+   pmbus-core.rst
+   submitting-patches.rst
+   sysfs-interface.rst
+   userspace-tools.rst
+
+Hardware Monitoring Kernel Drivers
+==================================
+
+.. toctree::
+   :maxdepth: 1
+
+   ab8500.rst
+   abituguru.rst
+   abituguru3.rst
+   abx500.rst
+   acpi_power_meter.rst
+   ad7314.rst
+   adc128d818.rst
+   adm1021.rst
+   adm1025.rst
+   adm1026.rst
+   adm1031.rst
+   adm1275.rst
+   adm9240.rst
+   ads1015.rst
+   ads7828.rst
+   adt7410.rst
+   adt7411.rst
+   adt7462.rst
+   adt7470.rst
+   adt7475.rst
+   amc6821.rst
+   asb100.rst
+   asc7621.rst
+   aspeed-pwm-tacho.rst
+   coretemp.rst
+   da9052.rst
+   da9055.rst
+   dme1737.rst
+   ds1621.rst
+   ds620.rst
+   emc1403.rst
+   emc2103.rst
+   emc6w201.rst
+   f71805f.rst
+   f71882fg.rst
+   fam15h_power.rst
+   ftsteutates.rst
+   g760a.rst
+   g762.rst
+   gl518sm.rst
+   hih6130.rst
+   ibmaem.rst
+   ibm-cffps.rst
+   ibmpowernv.rst
+   ina209.rst
+   ina2xx.rst
+   ina3221.rst
+   ir35221.rst
+   it87.rst
+   jc42.rst
+   k10temp.rst
+   k8temp.rst
+   lineage-pem.rst
+   lm25066.rst
+   lm63.rst
+   lm70.rst
+   lm73.rst
+   lm75.rst
+   lm77.rst
+   lm78.rst
+   lm80.rst
+   lm83.rst
+   lm85.rst
+   lm87.rst
+   lm90.rst
+   lm92.rst
+   lm93.rst
+   lm95234.rst
+   lm95245.rst
+   ltc2945.rst
+   ltc2978.rst
+   ltc2990.rst
+   ltc3815.rst
+   ltc4151.rst
+   ltc4215.rst
+   ltc4245.rst
+   ltc4260.rst
+   ltc4261.rst
+   max16064.rst
+   max16065.rst
+   max1619.rst
+   max1668.rst
+   max197.rst
+   max20751.rst
+   max31722.rst
+   max31785.rst
+   max31790.rst
+   max34440.rst
+   max6639.rst
+   max6642.rst
+   max6650.rst
+   max6697.rst
+   max8688.rst
+   mc13783-adc.rst
+   mcp3021.rst
+   menf21bmc.rst
+   mlxreg-fan.rst
+   nct6683.rst
+   nct6775.rst
+   nct7802.rst
+   nct7904.rst
+   npcm750-pwm-fan.rst
+   nsa320.rst
+   ntc_thermistor.rst
+   occ.rst
+   pc87360.rst
+   pc87427.rst
+   pcf8591.rst
+   pmbus.rst
+   powr1220.rst
+   pwm-fan.rst
+   raspberrypi-hwmon.rst
+   sch5627.rst
+   sch5636.rst
+   scpi-hwmon.rst
+   sht15.rst
+   sht21.rst
+   sht3x.rst
+   shtc1.rst
+   sis5595.rst
+   smm665.rst
+   smsc47b397.rst
+   smsc47m192.rst
+   smsc47m1.rst
+   tc654.rst
+   tc74.rst
+   thmc50.rst
+   tmp102.rst
+   tmp103.rst
+   tmp108.rst
+   tmp401.rst
+   tmp421.rst
+   tps40422.rst
+   twl4030-madc-hwmon.rst
+   ucd9000.rst
+   ucd9200.rst
+   vexpress.rst
+   via686a.rst
+   vt1211.rst
+   w83627ehf.rst
+   w83627hf.rst
+   w83773g.rst
+   w83781d.rst
+   w83791d.rst
+   w83792d.rst
+   w83793.rst
+   w83795.rst
+   w83l785ts.rst
+   w83l786ng.rst
+   wm831x.rst
+   wm8350.rst
+   xgene-hwmon.rst
+   zl6100.rst
+
+.. only::  subproject and html
+
+   Indices
+   =======
+
+   * :ref:`genindex`
diff --git a/Documentation/hwmon/ir35221 b/Documentation/hwmon/ir35221.rst
similarity index 100%
rename from Documentation/hwmon/ir35221
rename to Documentation/hwmon/ir35221.rst
diff --git a/Documentation/hwmon/it87 b/Documentation/hwmon/it87.rst
similarity index 100%
rename from Documentation/hwmon/it87
rename to Documentation/hwmon/it87.rst
diff --git a/Documentation/hwmon/jc42 b/Documentation/hwmon/jc42.rst
similarity index 100%
rename from Documentation/hwmon/jc42
rename to Documentation/hwmon/jc42.rst
diff --git a/Documentation/hwmon/k10temp b/Documentation/hwmon/k10temp.rst
similarity index 100%
rename from Documentation/hwmon/k10temp
rename to Documentation/hwmon/k10temp.rst
diff --git a/Documentation/hwmon/k8temp b/Documentation/hwmon/k8temp.rst
similarity index 100%
rename from Documentation/hwmon/k8temp
rename to Documentation/hwmon/k8temp.rst
diff --git a/Documentation/hwmon/lineage-pem b/Documentation/hwmon/lineage-pem.rst
similarity index 100%
rename from Documentation/hwmon/lineage-pem
rename to Documentation/hwmon/lineage-pem.rst
diff --git a/Documentation/hwmon/lm25066 b/Documentation/hwmon/lm25066.rst
similarity index 97%
rename from Documentation/hwmon/lm25066
rename to Documentation/hwmon/lm25066.rst
index 60b7f2722931..da15e3094c8c 100644
--- a/Documentation/hwmon/lm25066
+++ b/Documentation/hwmon/lm25066.rst
@@ -69,7 +69,7 @@ LM25066, LM5064, and LM5066/LM5066I Power Management, Monitoring,
 Control, and Protection ICs.
 
 The driver is a client driver to the core PMBus driver. Please see
-Documentation/hwmon/pmbus for details on PMBus client drivers.
+Documentation/hwmon/pmbus.rst for details on PMBus client drivers.
 
 
 Usage Notes
diff --git a/Documentation/hwmon/lm63 b/Documentation/hwmon/lm63.rst
similarity index 100%
rename from Documentation/hwmon/lm63
rename to Documentation/hwmon/lm63.rst
diff --git a/Documentation/hwmon/lm70 b/Documentation/hwmon/lm70.rst
similarity index 100%
rename from Documentation/hwmon/lm70
rename to Documentation/hwmon/lm70.rst
diff --git a/Documentation/hwmon/lm73 b/Documentation/hwmon/lm73.rst
similarity index 100%
rename from Documentation/hwmon/lm73
rename to Documentation/hwmon/lm73.rst
diff --git a/Documentation/hwmon/lm75 b/Documentation/hwmon/lm75.rst
similarity index 100%
rename from Documentation/hwmon/lm75
rename to Documentation/hwmon/lm75.rst
diff --git a/Documentation/hwmon/lm77 b/Documentation/hwmon/lm77.rst
similarity index 100%
rename from Documentation/hwmon/lm77
rename to Documentation/hwmon/lm77.rst
diff --git a/Documentation/hwmon/lm78 b/Documentation/hwmon/lm78.rst
similarity index 100%
rename from Documentation/hwmon/lm78
rename to Documentation/hwmon/lm78.rst
diff --git a/Documentation/hwmon/lm80 b/Documentation/hwmon/lm80.rst
similarity index 100%
rename from Documentation/hwmon/lm80
rename to Documentation/hwmon/lm80.rst
diff --git a/Documentation/hwmon/lm83 b/Documentation/hwmon/lm83.rst
similarity index 100%
rename from Documentation/hwmon/lm83
rename to Documentation/hwmon/lm83.rst
diff --git a/Documentation/hwmon/lm85 b/Documentation/hwmon/lm85.rst
similarity index 100%
rename from Documentation/hwmon/lm85
rename to Documentation/hwmon/lm85.rst
diff --git a/Documentation/hwmon/lm87 b/Documentation/hwmon/lm87.rst
similarity index 100%
rename from Documentation/hwmon/lm87
rename to Documentation/hwmon/lm87.rst
diff --git a/Documentation/hwmon/lm90 b/Documentation/hwmon/lm90.rst
similarity index 100%
rename from Documentation/hwmon/lm90
rename to Documentation/hwmon/lm90.rst
diff --git a/Documentation/hwmon/lm92 b/Documentation/hwmon/lm92.rst
similarity index 100%
rename from Documentation/hwmon/lm92
rename to Documentation/hwmon/lm92.rst
diff --git a/Documentation/hwmon/lm93 b/Documentation/hwmon/lm93.rst
similarity index 100%
rename from Documentation/hwmon/lm93
rename to Documentation/hwmon/lm93.rst
diff --git a/Documentation/hwmon/lm95234 b/Documentation/hwmon/lm95234.rst
similarity index 100%
rename from Documentation/hwmon/lm95234
rename to Documentation/hwmon/lm95234.rst
diff --git a/Documentation/hwmon/lm95245 b/Documentation/hwmon/lm95245.rst
similarity index 100%
rename from Documentation/hwmon/lm95245
rename to Documentation/hwmon/lm95245.rst
diff --git a/Documentation/hwmon/ltc2945 b/Documentation/hwmon/ltc2945.rst
similarity index 100%
rename from Documentation/hwmon/ltc2945
rename to Documentation/hwmon/ltc2945.rst
diff --git a/Documentation/hwmon/ltc2978 b/Documentation/hwmon/ltc2978.rst
similarity index 100%
rename from Documentation/hwmon/ltc2978
rename to Documentation/hwmon/ltc2978.rst
diff --git a/Documentation/hwmon/ltc2990 b/Documentation/hwmon/ltc2990.rst
similarity index 100%
rename from Documentation/hwmon/ltc2990
rename to Documentation/hwmon/ltc2990.rst
diff --git a/Documentation/hwmon/ltc3815 b/Documentation/hwmon/ltc3815.rst
similarity index 100%
rename from Documentation/hwmon/ltc3815
rename to Documentation/hwmon/ltc3815.rst
diff --git a/Documentation/hwmon/ltc4151 b/Documentation/hwmon/ltc4151.rst
similarity index 100%
rename from Documentation/hwmon/ltc4151
rename to Documentation/hwmon/ltc4151.rst
diff --git a/Documentation/hwmon/ltc4215 b/Documentation/hwmon/ltc4215.rst
similarity index 100%
rename from Documentation/hwmon/ltc4215
rename to Documentation/hwmon/ltc4215.rst
diff --git a/Documentation/hwmon/ltc4245 b/Documentation/hwmon/ltc4245.rst
similarity index 100%
rename from Documentation/hwmon/ltc4245
rename to Documentation/hwmon/ltc4245.rst
diff --git a/Documentation/hwmon/ltc4260 b/Documentation/hwmon/ltc4260.rst
similarity index 100%
rename from Documentation/hwmon/ltc4260
rename to Documentation/hwmon/ltc4260.rst
diff --git a/Documentation/hwmon/ltc4261 b/Documentation/hwmon/ltc4261.rst
similarity index 100%
rename from Documentation/hwmon/ltc4261
rename to Documentation/hwmon/ltc4261.rst
diff --git a/Documentation/hwmon/max16064 b/Documentation/hwmon/max16064.rst
similarity index 96%
rename from Documentation/hwmon/max16064
rename to Documentation/hwmon/max16064.rst
index 61ec679dc477..6d5e9538991f 100644
--- a/Documentation/hwmon/max16064
+++ b/Documentation/hwmon/max16064.rst
@@ -21,7 +21,7 @@ This driver supports hardware monitoring for Maxim MAX16064 Quad Power-Supply
 Controller with Active-Voltage Output Control and PMBus Interface.
 
 The driver is a client driver to the core PMBus driver.
-Please see Documentation/hwmon/pmbus for details on PMBus client drivers.
+Please see Documentation/hwmon/pmbus.rst for details on PMBus client drivers.
 
 
 Usage Notes
diff --git a/Documentation/hwmon/max16065 b/Documentation/hwmon/max16065.rst
similarity index 100%
rename from Documentation/hwmon/max16065
rename to Documentation/hwmon/max16065.rst
diff --git a/Documentation/hwmon/max1619 b/Documentation/hwmon/max1619.rst
similarity index 100%
rename from Documentation/hwmon/max1619
rename to Documentation/hwmon/max1619.rst
diff --git a/Documentation/hwmon/max1668 b/Documentation/hwmon/max1668.rst
similarity index 100%
rename from Documentation/hwmon/max1668
rename to Documentation/hwmon/max1668.rst
diff --git a/Documentation/hwmon/max197 b/Documentation/hwmon/max197.rst
similarity index 100%
rename from Documentation/hwmon/max197
rename to Documentation/hwmon/max197.rst
diff --git a/Documentation/hwmon/max20751 b/Documentation/hwmon/max20751.rst
similarity index 96%
rename from Documentation/hwmon/max20751
rename to Documentation/hwmon/max20751.rst
index d546695900ef..aa4469be6674 100644
--- a/Documentation/hwmon/max20751
+++ b/Documentation/hwmon/max20751.rst
@@ -23,7 +23,7 @@ This driver supports MAX20751 Multiphase Master with PMBus Interface
 and Internal Buck Converter.
 
 The driver is a client driver to the core PMBus driver.
-Please see Documentation/hwmon/pmbus for details on PMBus client drivers.
+Please see Documentation/hwmon/pmbus.rst for details on PMBus client drivers.
 
 
 Usage Notes
diff --git a/Documentation/hwmon/max31722 b/Documentation/hwmon/max31722.rst
similarity index 100%
rename from Documentation/hwmon/max31722
rename to Documentation/hwmon/max31722.rst
diff --git a/Documentation/hwmon/max31785 b/Documentation/hwmon/max31785.rst
similarity index 100%
rename from Documentation/hwmon/max31785
rename to Documentation/hwmon/max31785.rst
diff --git a/Documentation/hwmon/max31790 b/Documentation/hwmon/max31790.rst
similarity index 100%
rename from Documentation/hwmon/max31790
rename to Documentation/hwmon/max31790.rst
diff --git a/Documentation/hwmon/max34440 b/Documentation/hwmon/max34440.rst
similarity index 98%
rename from Documentation/hwmon/max34440
rename to Documentation/hwmon/max34440.rst
index 639838ef29fd..939138e12b02 100644
--- a/Documentation/hwmon/max34440
+++ b/Documentation/hwmon/max34440.rst
@@ -76,7 +76,7 @@ based on GIN pins. The MAX34460 supports 12 voltage channels, and the MAX34461
 supports 16 voltage channels.
 
 The driver is a client driver to the core PMBus driver. Please see
-Documentation/hwmon/pmbus for details on PMBus client drivers.
+Documentation/hwmon/pmbus.rst for details on PMBus client drivers.
 
 
 Usage Notes
diff --git a/Documentation/hwmon/max6639 b/Documentation/hwmon/max6639.rst
similarity index 100%
rename from Documentation/hwmon/max6639
rename to Documentation/hwmon/max6639.rst
diff --git a/Documentation/hwmon/max6642 b/Documentation/hwmon/max6642.rst
similarity index 100%
rename from Documentation/hwmon/max6642
rename to Documentation/hwmon/max6642.rst
diff --git a/Documentation/hwmon/max6650 b/Documentation/hwmon/max6650.rst
similarity index 100%
rename from Documentation/hwmon/max6650
rename to Documentation/hwmon/max6650.rst
diff --git a/Documentation/hwmon/max6697 b/Documentation/hwmon/max6697.rst
similarity index 100%
rename from Documentation/hwmon/max6697
rename to Documentation/hwmon/max6697.rst
diff --git a/Documentation/hwmon/max8688 b/Documentation/hwmon/max8688.rst
similarity index 97%
rename from Documentation/hwmon/max8688
rename to Documentation/hwmon/max8688.rst
index 43da139234c1..009487759c61 100644
--- a/Documentation/hwmon/max8688
+++ b/Documentation/hwmon/max8688.rst
@@ -21,7 +21,7 @@ This driver supports hardware monitoring for Maxim MAX8688 Digital Power-Supply
 Controller/Monitor with PMBus Interface.
 
 The driver is a client driver to the core PMBus driver. Please see
-Documentation/hwmon/pmbus for details on PMBus client drivers.
+Documentation/hwmon/pmbus.rst for details on PMBus client drivers.
 
 
 Usage Notes
diff --git a/Documentation/hwmon/mc13783-adc b/Documentation/hwmon/mc13783-adc.rst
similarity index 100%
rename from Documentation/hwmon/mc13783-adc
rename to Documentation/hwmon/mc13783-adc.rst
diff --git a/Documentation/hwmon/mcp3021 b/Documentation/hwmon/mcp3021.rst
similarity index 100%
rename from Documentation/hwmon/mcp3021
rename to Documentation/hwmon/mcp3021.rst
diff --git a/Documentation/hwmon/menf21bmc b/Documentation/hwmon/menf21bmc.rst
similarity index 100%
rename from Documentation/hwmon/menf21bmc
rename to Documentation/hwmon/menf21bmc.rst
diff --git a/Documentation/hwmon/mlxreg-fan b/Documentation/hwmon/mlxreg-fan.rst
similarity index 100%
rename from Documentation/hwmon/mlxreg-fan
rename to Documentation/hwmon/mlxreg-fan.rst
diff --git a/Documentation/hwmon/nct6683 b/Documentation/hwmon/nct6683.rst
similarity index 100%
rename from Documentation/hwmon/nct6683
rename to Documentation/hwmon/nct6683.rst
diff --git a/Documentation/hwmon/nct6775 b/Documentation/hwmon/nct6775.rst
similarity index 100%
rename from Documentation/hwmon/nct6775
rename to Documentation/hwmon/nct6775.rst
diff --git a/Documentation/hwmon/nct7802 b/Documentation/hwmon/nct7802.rst
similarity index 100%
rename from Documentation/hwmon/nct7802
rename to Documentation/hwmon/nct7802.rst
diff --git a/Documentation/hwmon/nct7904 b/Documentation/hwmon/nct7904.rst
similarity index 100%
rename from Documentation/hwmon/nct7904
rename to Documentation/hwmon/nct7904.rst
diff --git a/Documentation/hwmon/npcm750-pwm-fan b/Documentation/hwmon/npcm750-pwm-fan.rst
similarity index 100%
rename from Documentation/hwmon/npcm750-pwm-fan
rename to Documentation/hwmon/npcm750-pwm-fan.rst
diff --git a/Documentation/hwmon/nsa320 b/Documentation/hwmon/nsa320.rst
similarity index 100%
rename from Documentation/hwmon/nsa320
rename to Documentation/hwmon/nsa320.rst
diff --git a/Documentation/hwmon/ntc_thermistor b/Documentation/hwmon/ntc_thermistor.rst
similarity index 100%
rename from Documentation/hwmon/ntc_thermistor
rename to Documentation/hwmon/ntc_thermistor.rst
diff --git a/Documentation/hwmon/occ b/Documentation/hwmon/occ.rst
similarity index 100%
rename from Documentation/hwmon/occ
rename to Documentation/hwmon/occ.rst
diff --git a/Documentation/hwmon/pc87360 b/Documentation/hwmon/pc87360.rst
similarity index 100%
rename from Documentation/hwmon/pc87360
rename to Documentation/hwmon/pc87360.rst
diff --git a/Documentation/hwmon/pc87427 b/Documentation/hwmon/pc87427.rst
similarity index 100%
rename from Documentation/hwmon/pc87427
rename to Documentation/hwmon/pc87427.rst
diff --git a/Documentation/hwmon/pcf8591 b/Documentation/hwmon/pcf8591.rst
similarity index 100%
rename from Documentation/hwmon/pcf8591
rename to Documentation/hwmon/pcf8591.rst
diff --git a/Documentation/hwmon/pmbus-core b/Documentation/hwmon/pmbus-core.rst
similarity index 100%
rename from Documentation/hwmon/pmbus-core
rename to Documentation/hwmon/pmbus-core.rst
diff --git a/Documentation/hwmon/pmbus b/Documentation/hwmon/pmbus.rst
similarity index 100%
rename from Documentation/hwmon/pmbus
rename to Documentation/hwmon/pmbus.rst
diff --git a/Documentation/hwmon/powr1220 b/Documentation/hwmon/powr1220.rst
similarity index 100%
rename from Documentation/hwmon/powr1220
rename to Documentation/hwmon/powr1220.rst
diff --git a/Documentation/hwmon/pwm-fan b/Documentation/hwmon/pwm-fan.rst
similarity index 100%
rename from Documentation/hwmon/pwm-fan
rename to Documentation/hwmon/pwm-fan.rst
diff --git a/Documentation/hwmon/raspberrypi-hwmon b/Documentation/hwmon/raspberrypi-hwmon.rst
similarity index 100%
rename from Documentation/hwmon/raspberrypi-hwmon
rename to Documentation/hwmon/raspberrypi-hwmon.rst
diff --git a/Documentation/hwmon/sch5627 b/Documentation/hwmon/sch5627.rst
similarity index 100%
rename from Documentation/hwmon/sch5627
rename to Documentation/hwmon/sch5627.rst
diff --git a/Documentation/hwmon/sch5636 b/Documentation/hwmon/sch5636.rst
similarity index 100%
rename from Documentation/hwmon/sch5636
rename to Documentation/hwmon/sch5636.rst
diff --git a/Documentation/hwmon/scpi-hwmon b/Documentation/hwmon/scpi-hwmon.rst
similarity index 100%
rename from Documentation/hwmon/scpi-hwmon
rename to Documentation/hwmon/scpi-hwmon.rst
diff --git a/Documentation/hwmon/sht15 b/Documentation/hwmon/sht15.rst
similarity index 100%
rename from Documentation/hwmon/sht15
rename to Documentation/hwmon/sht15.rst
diff --git a/Documentation/hwmon/sht21 b/Documentation/hwmon/sht21.rst
similarity index 100%
rename from Documentation/hwmon/sht21
rename to Documentation/hwmon/sht21.rst
diff --git a/Documentation/hwmon/sht3x b/Documentation/hwmon/sht3x.rst
similarity index 100%
rename from Documentation/hwmon/sht3x
rename to Documentation/hwmon/sht3x.rst
diff --git a/Documentation/hwmon/shtc1 b/Documentation/hwmon/shtc1.rst
similarity index 100%
rename from Documentation/hwmon/shtc1
rename to Documentation/hwmon/shtc1.rst
diff --git a/Documentation/hwmon/sis5595 b/Documentation/hwmon/sis5595.rst
similarity index 100%
rename from Documentation/hwmon/sis5595
rename to Documentation/hwmon/sis5595.rst
diff --git a/Documentation/hwmon/smm665 b/Documentation/hwmon/smm665.rst
similarity index 100%
rename from Documentation/hwmon/smm665
rename to Documentation/hwmon/smm665.rst
diff --git a/Documentation/hwmon/smsc47b397 b/Documentation/hwmon/smsc47b397.rst
similarity index 100%
rename from Documentation/hwmon/smsc47b397
rename to Documentation/hwmon/smsc47b397.rst
diff --git a/Documentation/hwmon/smsc47m1 b/Documentation/hwmon/smsc47m1.rst
similarity index 100%
rename from Documentation/hwmon/smsc47m1
rename to Documentation/hwmon/smsc47m1.rst
diff --git a/Documentation/hwmon/smsc47m192 b/Documentation/hwmon/smsc47m192.rst
similarity index 100%
rename from Documentation/hwmon/smsc47m192
rename to Documentation/hwmon/smsc47m192.rst
diff --git a/Documentation/hwmon/submitting-patches b/Documentation/hwmon/submitting-patches.rst
similarity index 98%
rename from Documentation/hwmon/submitting-patches
rename to Documentation/hwmon/submitting-patches.rst
index 12540b7d9b50..f9796b9d9db6 100644
--- a/Documentation/hwmon/submitting-patches
+++ b/Documentation/hwmon/submitting-patches.rst
@@ -39,7 +39,7 @@ increase the chances of your change being accepted.
 2. Adding functionality to existing drivers
 -------------------------------------------
 
-* Make sure the documentation in Documentation/hwmon/<driver_name> is up to
+* Make sure the documentation in Documentation/hwmon/<driver_name>.rst is up to
   date.
 
 * Make sure the information in Kconfig is up to date.
@@ -61,7 +61,7 @@ increase the chances of your change being accepted.
 
 * Consider adding yourself to MAINTAINERS.
 
-* Document the driver in Documentation/hwmon/<driver_name>.
+* Document the driver in Documentation/hwmon/<driver_name>.rst.
 
 * Add the driver to Kconfig and Makefile in alphabetical order.
 
@@ -134,7 +134,7 @@ increase the chances of your change being accepted.
   non-standard attributes, or you believe you do, discuss it on the mailing list
   first. Either case, provide a detailed explanation why you need the
   non-standard attribute(s).
-  Standard attributes are specified in Documentation/hwmon/sysfs-interface.
+  Standard attributes are specified in Documentation/hwmon/sysfs-interface.rst.
 
 * When deciding which sysfs attributes to support, look at the chip's
   capabilities. While we do not expect your driver to support everything the
diff --git a/Documentation/hwmon/sysfs-interface b/Documentation/hwmon/sysfs-interface.rst
similarity index 100%
rename from Documentation/hwmon/sysfs-interface
rename to Documentation/hwmon/sysfs-interface.rst
diff --git a/Documentation/hwmon/tc654 b/Documentation/hwmon/tc654.rst
similarity index 100%
rename from Documentation/hwmon/tc654
rename to Documentation/hwmon/tc654.rst
diff --git a/Documentation/hwmon/tc74 b/Documentation/hwmon/tc74.rst
similarity index 100%
rename from Documentation/hwmon/tc74
rename to Documentation/hwmon/tc74.rst
diff --git a/Documentation/hwmon/thmc50 b/Documentation/hwmon/thmc50.rst
similarity index 100%
rename from Documentation/hwmon/thmc50
rename to Documentation/hwmon/thmc50.rst
diff --git a/Documentation/hwmon/tmp102 b/Documentation/hwmon/tmp102.rst
similarity index 93%
rename from Documentation/hwmon/tmp102
rename to Documentation/hwmon/tmp102.rst
index 5e34821df4ab..b1f585531a88 100644
--- a/Documentation/hwmon/tmp102
+++ b/Documentation/hwmon/tmp102.rst
@@ -28,4 +28,4 @@ The TMP102 has a programmable update rate that can select between 8, 4, 1, and
 0.5 Hz. (Currently the driver only supports the default of 4 Hz).
 
 The driver provides the common sysfs-interface for temperatures (see
-Documentation/hwmon/sysfs-interface under Temperatures).
+Documentation/hwmon/sysfs-interface.rst under Temperatures).
diff --git a/Documentation/hwmon/tmp103 b/Documentation/hwmon/tmp103.rst
similarity index 92%
rename from Documentation/hwmon/tmp103
rename to Documentation/hwmon/tmp103.rst
index 7682a795e38c..15d25806d585 100644
--- a/Documentation/hwmon/tmp103
+++ b/Documentation/hwmon/tmp103.rst
@@ -27,7 +27,7 @@ Resolution: 8 Bits
 Accuracy: ±1°C Typ (–10°C to +100°C)
 
 The driver provides the common sysfs-interface for temperatures (see
-Documentation/hwmon/sysfs-interface under Temperatures).
+Documentation/hwmon/sysfs-interface.rst under Temperatures).
 
 Please refer how to instantiate this driver:
 Documentation/i2c/instantiating-devices
diff --git a/Documentation/hwmon/tmp108 b/Documentation/hwmon/tmp108.rst
similarity index 95%
rename from Documentation/hwmon/tmp108
rename to Documentation/hwmon/tmp108.rst
index 7e08b7ef1e2f..5f4266a16cb2 100644
--- a/Documentation/hwmon/tmp108
+++ b/Documentation/hwmon/tmp108.rst
@@ -38,4 +38,4 @@ and then the device is shut down automatically. (This driver only supports
 continuous mode.)
 
 The driver provides the common sysfs-interface for temperatures (see
-Documentation/hwmon/sysfs-interface under Temperatures).
+Documentation/hwmon/sysfs-interface.rst under Temperatures).
diff --git a/Documentation/hwmon/tmp401 b/Documentation/hwmon/tmp401.rst
similarity index 97%
rename from Documentation/hwmon/tmp401
rename to Documentation/hwmon/tmp401.rst
index bd865bbdb38d..6a05a0719bc7 100644
--- a/Documentation/hwmon/tmp401
+++ b/Documentation/hwmon/tmp401.rst
@@ -68,7 +68,7 @@ supported by the driver so far, so using the default resolution of 0.5
 degree).
 
 The driver provides the common sysfs-interface for temperatures (see
-Documentation/hwmon/sysfs-interface under Temperatures).
+Documentation/hwmon/sysfs-interface.rst under Temperatures).
 
 The TMP411 and TMP431 chips are compatible with TMP401. TMP411 provides
 some additional features.
diff --git a/Documentation/hwmon/tmp421 b/Documentation/hwmon/tmp421.rst
similarity index 100%
rename from Documentation/hwmon/tmp421
rename to Documentation/hwmon/tmp421.rst
diff --git a/Documentation/hwmon/tps40422 b/Documentation/hwmon/tps40422.rst
similarity index 96%
rename from Documentation/hwmon/tps40422
rename to Documentation/hwmon/tps40422.rst
index 359751eb5ed4..b691e30479dd 100644
--- a/Documentation/hwmon/tps40422
+++ b/Documentation/hwmon/tps40422.rst
@@ -21,7 +21,7 @@ This driver supports TI TPS40422 Dual-Output or Two-Phase Synchronous Buck
 Controller with PMBus
 
 The driver is a client driver to the core PMBus driver.
-Please see Documentation/hwmon/pmbus for details on PMBus client drivers.
+Please see Documentation/hwmon/pmbus.rst for details on PMBus client drivers.
 
 
 Usage Notes
diff --git a/Documentation/hwmon/twl4030-madc-hwmon b/Documentation/hwmon/twl4030-madc-hwmon.rst
similarity index 100%
rename from Documentation/hwmon/twl4030-madc-hwmon
rename to Documentation/hwmon/twl4030-madc-hwmon.rst
diff --git a/Documentation/hwmon/ucd9000 b/Documentation/hwmon/ucd9000.rst
similarity index 97%
rename from Documentation/hwmon/ucd9000
rename to Documentation/hwmon/ucd9000.rst
index d69061b7312c..ebc4f2b3bfea 100644
--- a/Documentation/hwmon/ucd9000
+++ b/Documentation/hwmon/ucd9000.rst
@@ -57,7 +57,7 @@ system-health monitor. The device integrates a 12-bit ADC for monitoring up to
 13 power-supply voltage, current, or temperature inputs.
 
 This driver is a client driver to the core PMBus driver. Please see
-Documentation/hwmon/pmbus for details on PMBus client drivers.
+Documentation/hwmon/pmbus.rst for details on PMBus client drivers.
 
 
 Usage Notes
@@ -72,7 +72,7 @@ Platform data support
 ---------------------
 
 The driver supports standard PMBus driver platform data. Please see
-Documentation/hwmon/pmbus for details.
+Documentation/hwmon/pmbus.rst for details.
 
 
 Sysfs entries
diff --git a/Documentation/hwmon/ucd9200 b/Documentation/hwmon/ucd9200.rst
similarity index 97%
rename from Documentation/hwmon/ucd9200
rename to Documentation/hwmon/ucd9200.rst
index 44eda4a579b6..b819dfd75f71 100644
--- a/Documentation/hwmon/ucd9200
+++ b/Documentation/hwmon/ucd9200.rst
@@ -33,7 +33,7 @@ dedicated circuitry for DC/DC loop management with flash memory and a serial
 interface to support configuration, monitoring and management.
 
 This driver is a client driver to the core PMBus driver. Please see
-Documentation/hwmon/pmbus for details on PMBus client drivers.
+Documentation/hwmon/pmbus.rst for details on PMBus client drivers.
 
 
 Usage Notes
@@ -48,7 +48,7 @@ Platform data support
 ---------------------
 
 The driver supports standard PMBus driver platform data. Please see
-Documentation/hwmon/pmbus for details.
+Documentation/hwmon/pmbus.rst for details.
 
 
 Sysfs entries
diff --git a/Documentation/hwmon/userspace-tools b/Documentation/hwmon/userspace-tools.rst
similarity index 100%
rename from Documentation/hwmon/userspace-tools
rename to Documentation/hwmon/userspace-tools.rst
diff --git a/Documentation/hwmon/vexpress b/Documentation/hwmon/vexpress.rst
similarity index 100%
rename from Documentation/hwmon/vexpress
rename to Documentation/hwmon/vexpress.rst
diff --git a/Documentation/hwmon/via686a b/Documentation/hwmon/via686a.rst
similarity index 100%
rename from Documentation/hwmon/via686a
rename to Documentation/hwmon/via686a.rst
diff --git a/Documentation/hwmon/vt1211 b/Documentation/hwmon/vt1211.rst
similarity index 100%
rename from Documentation/hwmon/vt1211
rename to Documentation/hwmon/vt1211.rst
diff --git a/Documentation/hwmon/w83627ehf b/Documentation/hwmon/w83627ehf.rst
similarity index 100%
rename from Documentation/hwmon/w83627ehf
rename to Documentation/hwmon/w83627ehf.rst
diff --git a/Documentation/hwmon/w83627hf b/Documentation/hwmon/w83627hf.rst
similarity index 100%
rename from Documentation/hwmon/w83627hf
rename to Documentation/hwmon/w83627hf.rst
diff --git a/Documentation/hwmon/w83773g b/Documentation/hwmon/w83773g.rst
similarity index 100%
rename from Documentation/hwmon/w83773g
rename to Documentation/hwmon/w83773g.rst
diff --git a/Documentation/hwmon/w83781d b/Documentation/hwmon/w83781d.rst
similarity index 100%
rename from Documentation/hwmon/w83781d
rename to Documentation/hwmon/w83781d.rst
diff --git a/Documentation/hwmon/w83791d b/Documentation/hwmon/w83791d.rst
similarity index 99%
rename from Documentation/hwmon/w83791d
rename to Documentation/hwmon/w83791d.rst
index a91f9e5fb0c6..3adaed39b157 100644
--- a/Documentation/hwmon/w83791d
+++ b/Documentation/hwmon/w83791d.rst
@@ -102,7 +102,7 @@ This file is used for both legacy and new code.
 
 The sysfs interface to the beep bitmask has migrated from the original legacy
 method of a single sysfs beep_mask file to a newer method using multiple
-`*_beep` files as described in `Documentation/hwmon/sysfs-interface`.
+`*_beep` files as described in `Documentation/hwmon/sysfs-interface.rst`.
 
 A similar change has occurred for the bitmap corresponding to the alarms. The
 original legacy method used a single sysfs alarms file containing a bitmap
diff --git a/Documentation/hwmon/w83792d b/Documentation/hwmon/w83792d.rst
similarity index 100%
rename from Documentation/hwmon/w83792d
rename to Documentation/hwmon/w83792d.rst
diff --git a/Documentation/hwmon/w83793 b/Documentation/hwmon/w83793.rst
similarity index 100%
rename from Documentation/hwmon/w83793
rename to Documentation/hwmon/w83793.rst
diff --git a/Documentation/hwmon/w83795 b/Documentation/hwmon/w83795.rst
similarity index 100%
rename from Documentation/hwmon/w83795
rename to Documentation/hwmon/w83795.rst
diff --git a/Documentation/hwmon/w83l785ts b/Documentation/hwmon/w83l785ts.rst
similarity index 100%
rename from Documentation/hwmon/w83l785ts
rename to Documentation/hwmon/w83l785ts.rst
diff --git a/Documentation/hwmon/w83l786ng b/Documentation/hwmon/w83l786ng.rst
similarity index 100%
rename from Documentation/hwmon/w83l786ng
rename to Documentation/hwmon/w83l786ng.rst
diff --git a/Documentation/hwmon/wm831x b/Documentation/hwmon/wm831x.rst
similarity index 100%
rename from Documentation/hwmon/wm831x
rename to Documentation/hwmon/wm831x.rst
diff --git a/Documentation/hwmon/wm8350 b/Documentation/hwmon/wm8350.rst
similarity index 100%
rename from Documentation/hwmon/wm8350
rename to Documentation/hwmon/wm8350.rst
diff --git a/Documentation/hwmon/xgene-hwmon b/Documentation/hwmon/xgene-hwmon.rst
similarity index 100%
rename from Documentation/hwmon/xgene-hwmon
rename to Documentation/hwmon/xgene-hwmon.rst
diff --git a/Documentation/hwmon/zl6100 b/Documentation/hwmon/zl6100.rst
similarity index 98%
rename from Documentation/hwmon/zl6100
rename to Documentation/hwmon/zl6100.rst
index 4029970bace4..41513bb7fe51 100644
--- a/Documentation/hwmon/zl6100
+++ b/Documentation/hwmon/zl6100.rst
@@ -113,7 +113,7 @@ This driver supports hardware monitoring for Intersil / Zilker Labs ZL6100 and
 compatible digital DC-DC controllers.
 
 The driver is a client driver to the core PMBus driver. Please see
-Documentation/hwmon/pmbus and Documentation.hwmon/pmbus-core for details
+Documentation/hwmon/pmbus.rst and Documentation.hwmon/pmbus-core for details
 on PMBus client drivers.
 
 
diff --git a/Documentation/index.rst b/Documentation/index.rst
index 80a421cb935e..3a710dc24fc8 100644
--- a/Documentation/index.rst
+++ b/Documentation/index.rst
@@ -83,6 +83,7 @@ needed).
    media/index
    networking/index
    input/index
+   hwmon/index
    gpu/index
    security/index
    sound/index
diff --git a/Documentation/thermal/sysfs-api.txt b/Documentation/thermal/sysfs-api.txt
index 911399730c1c..c3fa500df92c 100644
--- a/Documentation/thermal/sysfs-api.txt
+++ b/Documentation/thermal/sysfs-api.txt
@@ -316,7 +316,7 @@ ACPI thermal zones.
     |---temp[1-*]_input:	The current temperature of thermal zone [1-*]
     |---temp[1-*]_critical:	The critical trip point of thermal zone [1-*]
 
-Please read Documentation/hwmon/sysfs-interface for additional information.
+Please read Documentation/hwmon/sysfs-interface.rst for additional information.
 
 ***************************
 * Thermal zone attributes *
diff --git a/MAINTAINERS b/MAINTAINERS
index dc615cb76455..d258fb8e7e8e 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -468,7 +468,7 @@ ADM1025 HARDWARE MONITOR DRIVER
 M:	Jean Delvare <jdelvare@suse.com>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/adm1025
+F:	Documentation/hwmon/adm1025.rst
 F:	drivers/hwmon/adm1025.c
 
 ADM1029 HARDWARE MONITOR DRIVER
@@ -520,7 +520,7 @@ ADS1015 HARDWARE MONITOR DRIVER
 M:	Dirk Eibach <eibach@gdsys.de>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/ads1015
+F:	Documentation/hwmon/ads1015.rst
 F:	drivers/hwmon/ads1015.c
 F:	include/linux/platform_data/ads1015.h
 
@@ -533,7 +533,7 @@ ADT7475 HARDWARE MONITOR DRIVER
 M:	Jean Delvare <jdelvare@suse.com>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/adt7475
+F:	Documentation/hwmon/adt7475.rst
 F:	drivers/hwmon/adt7475.c
 
 ADVANSYS SCSI DRIVER
@@ -764,7 +764,7 @@ AMD FAM15H PROCESSOR POWER MONITORING DRIVER
 M:	Huang Rui <ray.huang@amd.com>
 L:	linux-hwmon@vger.kernel.org
 S:	Supported
-F:	Documentation/hwmon/fam15h_power
+F:	Documentation/hwmon/fam15h_power.rst
 F:	drivers/hwmon/fam15h_power.c
 
 AMD FCH GPIO DRIVER
@@ -2512,7 +2512,7 @@ ASC7621 HARDWARE MONITOR DRIVER
 M:	George Joseph <george.joseph@fairview5.com>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/asc7621
+F:	Documentation/hwmon/asc7621.rst
 F:	drivers/hwmon/asc7621.c
 
 ASPEED VIDEO ENGINE DRIVER
@@ -4043,7 +4043,7 @@ CORETEMP HARDWARE MONITORING DRIVER
 M:	Fenghua Yu <fenghua.yu@intel.com>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/coretemp
+F:	Documentation/hwmon/coretemp.rst
 F:	drivers/hwmon/coretemp.c
 
 COSA/SRP SYNC SERIAL DRIVER
@@ -4598,7 +4598,7 @@ DIALOG SEMICONDUCTOR DRIVERS
 M:	Support Opensource <support.opensource@diasemi.com>
 W:	http://www.dialog-semiconductor.com/products
 S:	Supported
-F:	Documentation/hwmon/da90??
+F:	Documentation/hwmon/da90??.rst
 F:	Documentation/devicetree/bindings/mfd/da90*.txt
 F:	Documentation/devicetree/bindings/input/da90??-onkey.txt
 F:	Documentation/devicetree/bindings/thermal/da90??-thermal.txt
@@ -4749,7 +4749,7 @@ DME1737 HARDWARE MONITOR DRIVER
 M:	Juerg Haefliger <juergh@gmail.com>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/dme1737
+F:	Documentation/hwmon/dme1737.rst
 F:	drivers/hwmon/dme1737.c
 
 DMI/SMBIOS SUPPORT
@@ -5935,7 +5935,7 @@ F71805F HARDWARE MONITORING DRIVER
 M:	Jean Delvare <jdelvare@suse.com>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/f71805f
+F:	Documentation/hwmon/f71805f.rst
 F:	drivers/hwmon/f71805f.c
 
 FADDR2LINE
@@ -7618,7 +7618,7 @@ INA209 HARDWARE MONITOR DRIVER
 M:	Guenter Roeck <linux@roeck-us.net>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/ina209
+F:	Documentation/hwmon/ina209.rst
 F:	Documentation/devicetree/bindings/hwmon/ina2xx.txt
 F:	drivers/hwmon/ina209.c
 
@@ -7626,7 +7626,7 @@ INA2XX HARDWARE MONITOR DRIVER
 M:	Guenter Roeck <linux@roeck-us.net>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/ina2xx
+F:	Documentation/hwmon/ina2xx.rst
 F:	drivers/hwmon/ina2xx.c
 F:	include/linux/platform_data/ina2xx.h
 
@@ -8244,7 +8244,7 @@ IT87 HARDWARE MONITORING DRIVER
 M:	Jean Delvare <jdelvare@suse.com>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/it87
+F:	Documentation/hwmon/it87.rst
 F:	drivers/hwmon/it87.c
 
 IT913X MEDIA DRIVER
@@ -8288,7 +8288,7 @@ M:	Guenter Roeck <linux@roeck-us.net>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
 F:	drivers/hwmon/jc42.c
-F:	Documentation/hwmon/jc42
+F:	Documentation/hwmon/jc42.rst
 
 JFS FILESYSTEM
 M:	Dave Kleikamp <shaggy@kernel.org>
@@ -8336,14 +8336,14 @@ K10TEMP HARDWARE MONITORING DRIVER
 M:	Clemens Ladisch <clemens@ladisch.de>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/k10temp
+F:	Documentation/hwmon/k10temp.rst
 F:	drivers/hwmon/k10temp.c
 
 K8TEMP HARDWARE MONITORING DRIVER
 M:	Rudolf Marek <r.marek@assembler.cz>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/k8temp
+F:	Documentation/hwmon/k8temp.rst
 F:	drivers/hwmon/k8temp.c
 
 KASAN
@@ -9034,21 +9034,21 @@ LM78 HARDWARE MONITOR DRIVER
 M:	Jean Delvare <jdelvare@suse.com>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/lm78
+F:	Documentation/hwmon/lm78.rst
 F:	drivers/hwmon/lm78.c
 
 LM83 HARDWARE MONITOR DRIVER
 M:	Jean Delvare <jdelvare@suse.com>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/lm83
+F:	Documentation/hwmon/lm83.rst
 F:	drivers/hwmon/lm83.c
 
 LM90 HARDWARE MONITOR DRIVER
 M:	Jean Delvare <jdelvare@suse.com>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/lm90
+F:	Documentation/hwmon/lm90.rst
 F:	Documentation/devicetree/bindings/hwmon/lm90.txt
 F:	drivers/hwmon/lm90.c
 F:	include/dt-bindings/thermal/lm90.h
@@ -9057,7 +9057,7 @@ LM95234 HARDWARE MONITOR DRIVER
 M:	Guenter Roeck <linux@roeck-us.net>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/lm95234
+F:	Documentation/hwmon/lm95234.rst
 F:	drivers/hwmon/lm95234.c
 
 LME2510 MEDIA DRIVER
@@ -9131,7 +9131,7 @@ LTC4261 HARDWARE MONITOR DRIVER
 M:	Guenter Roeck <linux@roeck-us.net>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/ltc4261
+F:	Documentation/hwmon/ltc4261.rst
 F:	drivers/hwmon/ltc4261.c
 
 LTC4306 I2C MULTIPLEXER DRIVER
@@ -9362,7 +9362,7 @@ MAX16065 HARDWARE MONITOR DRIVER
 M:	Guenter Roeck <linux@roeck-us.net>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/max16065
+F:	Documentation/hwmon/max16065.rst
 F:	drivers/hwmon/max16065.c
 
 MAX2175 SDR TUNER DRIVER
@@ -9378,14 +9378,14 @@ F:	include/uapi/linux/max2175.h
 MAX6650 HARDWARE MONITOR AND FAN CONTROLLER DRIVER
 L:	linux-hwmon@vger.kernel.org
 S:	Orphan
-F:	Documentation/hwmon/max6650
+F:	Documentation/hwmon/max6650.rst
 F:	drivers/hwmon/max6650.c
 
 MAX6697 HARDWARE MONITOR DRIVER
 M:	Guenter Roeck <linux@roeck-us.net>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/max6697
+F:	Documentation/hwmon/max6697.rst
 F:	Documentation/devicetree/bindings/hwmon/max6697.txt
 F:	drivers/hwmon/max6697.c
 F:	include/linux/platform_data/max6697.h
@@ -10031,7 +10031,7 @@ F:	drivers/mfd/menf21bmc.c
 F:	drivers/watchdog/menf21bmc_wdt.c
 F:	drivers/leds/leds-menf21bmc.c
 F:	drivers/hwmon/menf21bmc_hwmon.c
-F:	Documentation/hwmon/menf21bmc
+F:	Documentation/hwmon/menf21bmc.rst
 
 MEN Z069 WATCHDOG DRIVER
 M:	Johannes Thumshirn <jth@kernel.org>
@@ -10659,7 +10659,7 @@ NCT6775 HARDWARE MONITOR DRIVER
 M:	Guenter Roeck <linux@roeck-us.net>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/nct6775
+F:	Documentation/hwmon/nct6775.rst
 F:	drivers/hwmon/nct6775.c
 
 NET_FAILOVER MODULE
@@ -11753,7 +11753,7 @@ PC87360 HARDWARE MONITORING DRIVER
 M:	Jim Cromie <jim.cromie@gmail.com>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/pc87360
+F:	Documentation/hwmon/pc87360.rst
 F:	drivers/hwmon/pc87360.c
 
 PC8736x GPIO DRIVER
@@ -11765,7 +11765,7 @@ PC87427 HARDWARE MONITORING DRIVER
 M:	Jean Delvare <jdelvare@suse.com>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/pc87427
+F:	Documentation/hwmon/pc87427.rst
 F:	drivers/hwmon/pc87427.c
 
 PCA9532 LED DRIVER
@@ -12333,23 +12333,23 @@ S:	Maintained
 F:	Documentation/devicetree/bindings/hwmon/ibm,cffps1.txt
 F:	Documentation/devicetree/bindings/hwmon/max31785.txt
 F:	Documentation/devicetree/bindings/hwmon/ltc2978.txt
-F:	Documentation/hwmon/adm1275
-F:	Documentation/hwmon/ibm-cffps
-F:	Documentation/hwmon/ir35221
-F:	Documentation/hwmon/lm25066
-F:	Documentation/hwmon/ltc2978
-F:	Documentation/hwmon/ltc3815
-F:	Documentation/hwmon/max16064
-F:	Documentation/hwmon/max20751
-F:	Documentation/hwmon/max31785
-F:	Documentation/hwmon/max34440
-F:	Documentation/hwmon/max8688
-F:	Documentation/hwmon/pmbus
-F:	Documentation/hwmon/pmbus-core
-F:	Documentation/hwmon/tps40422
-F:	Documentation/hwmon/ucd9000
-F:	Documentation/hwmon/ucd9200
-F:	Documentation/hwmon/zl6100
+F:	Documentation/hwmon/adm1275.rst
+F:	Documentation/hwmon/ibm-cffps.rst
+F:	Documentation/hwmon/ir35221.rst
+F:	Documentation/hwmon/lm25066.rst
+F:	Documentation/hwmon/ltc2978.rst
+F:	Documentation/hwmon/ltc3815.rst
+F:	Documentation/hwmon/max16064.rst
+F:	Documentation/hwmon/max20751.rst
+F:	Documentation/hwmon/max31785.rst
+F:	Documentation/hwmon/max34440.rst
+F:	Documentation/hwmon/max8688.rst
+F:	Documentation/hwmon/pmbus.rst
+F:	Documentation/hwmon/pmbus-core.rst
+F:	Documentation/hwmon/tps40422.rst
+F:	Documentation/hwmon/ucd9000.rst
+F:	Documentation/hwmon/ucd9200.rst
+F:	Documentation/hwmon/zl6100.rst
 F:	drivers/hwmon/pmbus/
 F:	include/linux/pmbus.h
 
@@ -12613,7 +12613,7 @@ M:	Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
 L:	linux-hwmon@vger.kernel.org
 S:	Supported
 F:	Documentation/devicetree/bindings/hwmon/pwm-fan.txt
-F:	Documentation/hwmon/pwm-fan
+F:	Documentation/hwmon/pwm-fan.rst
 F:	drivers/hwmon/pwm-fan.c
 
 PWM IR Transmitter
@@ -14278,21 +14278,21 @@ SMM665 HARDWARE MONITOR DRIVER
 M:	Guenter Roeck <linux@roeck-us.net>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/smm665
+F:	Documentation/hwmon/smm665.rst
 F:	drivers/hwmon/smm665.c
 
 SMSC EMC2103 HARDWARE MONITOR DRIVER
 M:	Steve Glendinning <steve.glendinning@shawell.net>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/emc2103
+F:	Documentation/hwmon/emc2103.rst
 F:	drivers/hwmon/emc2103.c
 
 SMSC SCH5627 HARDWARE MONITOR DRIVER
 M:	Hans de Goede <hdegoede@redhat.com>
 L:	linux-hwmon@vger.kernel.org
 S:	Supported
-F:	Documentation/hwmon/sch5627
+F:	Documentation/hwmon/sch5627.rst
 F:	drivers/hwmon/sch5627.c
 
 SMSC UFX6000 and UFX7000 USB to VGA DRIVER
@@ -14305,7 +14305,7 @@ SMSC47B397 HARDWARE MONITOR DRIVER
 M:	Jean Delvare <jdelvare@suse.com>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/smsc47b397
+F:	Documentation/hwmon/smsc47b397.rst
 F:	drivers/hwmon/smsc47b397.c
 
 SMSC911x ETHERNET DRIVER
@@ -15650,7 +15650,7 @@ TMP401 HARDWARE MONITOR DRIVER
 M:	Guenter Roeck <linux@roeck-us.net>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/tmp401
+F:	Documentation/hwmon/tmp401.rst
 F:	drivers/hwmon/tmp401.c
 
 TMPFS (SHMEM FILESYSTEM)
@@ -16675,7 +16675,7 @@ VT1211 HARDWARE MONITOR DRIVER
 M:	Juerg Haefliger <juergh@gmail.com>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/vt1211
+F:	Documentation/hwmon/vt1211.rst
 F:	drivers/hwmon/vt1211.c
 
 VT8231 HARDWARE MONITOR DRIVER
@@ -16703,14 +16703,14 @@ W83791D HARDWARE MONITORING DRIVER
 M:	Marc Hulsman <m.hulsman@tudelft.nl>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/w83791d
+F:	Documentation/hwmon/w83791d.rst
 F:	drivers/hwmon/w83791d.c
 
 W83793 HARDWARE MONITORING DRIVER
 M:	Rudolf Marek <r.marek@assembler.cz>
 L:	linux-hwmon@vger.kernel.org
 S:	Maintained
-F:	Documentation/hwmon/w83793
+F:	Documentation/hwmon/w83793.rst
 F:	drivers/hwmon/w83793.c
 
 W83795 HARDWARE MONITORING DRIVER
@@ -16819,7 +16819,7 @@ L:	patches@opensource.cirrus.com
 T:	git https://github.com/CirrusLogic/linux-drivers.git
 W:	https://github.com/CirrusLogic/linux-drivers/wiki
 S:	Supported
-F:	Documentation/hwmon/wm83??
+F:	Documentation/hwmon/wm83??.rst
 F:	Documentation/devicetree/bindings/extcon/extcon-arizona.txt
 F:	Documentation/devicetree/bindings/regulator/arizona-regulator.txt
 F:	Documentation/devicetree/bindings/mfd/arizona.txt
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
index 6f929bfa9fcd..74c6c95cb657 100644
--- a/drivers/hwmon/Kconfig
+++ b/drivers/hwmon/Kconfig
@@ -17,7 +17,7 @@ menuconfig HWMON
 
 	  To find out which specific driver(s) you need, use the
 	  sensors-detect script from the lm_sensors package.  Read
-	  <file:Documentation/hwmon/userspace-tools> for details.
+	  <file:Documentation/hwmon/userspace-tools.rst> for details.
 
 	  This support can also be built as a module. If so, the module
 	  will be called hwmon.
@@ -59,7 +59,7 @@ config SENSORS_ABITUGURU
 	  chip can be found on Abit uGuru featuring motherboards (most modern
 	  Abit motherboards from before end 2005). For more info and a list
 	  of which motherboards have which revision see
-	  Documentation/hwmon/abituguru
+	  Documentation/hwmon/abituguru.rst
 
 	  This driver can also be built as a module. If so, the module
 	  will be called abituguru.
@@ -73,7 +73,7 @@ config SENSORS_ABITUGURU3
 	  and their settings is supported. The third revision of the Abit
 	  uGuru chip can be found on recent Abit motherboards (since end
 	  2005). For more info and a list of which motherboards have which
-	  revision see Documentation/hwmon/abituguru3
+	  revision see Documentation/hwmon/abituguru3.rst
 
 	  This driver can also be built as a module. If so, the module
 	  will be called abituguru3.
@@ -643,7 +643,7 @@ config SENSORS_CORETEMP
 	help
 	  If you say yes here you get support for the temperature
 	  sensor inside your CPU. Most of the family 6 CPUs
-	  are supported. Check Documentation/hwmon/coretemp for details.
+	  are supported. Check Documentation/hwmon/coretemp.rst for details.
 
 config SENSORS_IT87
 	tristate "ITE IT87xx and compatibles"
diff --git a/drivers/hwmon/ads7828.c b/drivers/hwmon/ads7828.c
index 12c56d3783ed..545b635a104e 100644
--- a/drivers/hwmon/ads7828.c
+++ b/drivers/hwmon/ads7828.c
@@ -8,7 +8,7 @@
  *
  * ADS7830 support, by Guillaume Roguez <guillaume.roguez@savoirfairelinux.com>
  *
- * For further information, see the Documentation/hwmon/ads7828 file.
+ * For further information, see the Documentation/hwmon/ads7828.rst file.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
diff --git a/drivers/hwmon/max197.c b/drivers/hwmon/max197.c
index 3d9e210beedf..dd6a35219a18 100644
--- a/drivers/hwmon/max197.c
+++ b/drivers/hwmon/max197.c
@@ -8,7 +8,7 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  *
- * For further information, see the Documentation/hwmon/max197 file.
+ * For further information, see the Documentation/hwmon/max197.rst file.
  */
 
 #include <linux/kernel.h>
diff --git a/drivers/hwmon/sht15.c b/drivers/hwmon/sht15.c
index 39b41e35c2bf..7f4a63959730 100644
--- a/drivers/hwmon/sht15.c
+++ b/drivers/hwmon/sht15.c
@@ -10,7 +10,7 @@
  *
  * Copyright (c) 2007 Wouter Horre
  *
- * For further information, see the Documentation/hwmon/sht15 file.
+ * For further information, see the Documentation/hwmon/sht15.rst file.
  */
 
 #include <linux/interrupt.h>
diff --git a/include/linux/platform_data/ads7828.h b/include/linux/platform_data/ads7828.h
index 3245f45f9d77..a3370a007702 100644
--- a/include/linux/platform_data/ads7828.h
+++ b/include/linux/platform_data/ads7828.h
@@ -4,7 +4,7 @@
  * Copyright (c) 2012 Savoir-faire Linux Inc.
  *          Vivien Didelot <vivien.didelot@savoirfairelinux.com>
  *
- * For further information, see the Documentation/hwmon/ads7828 file.
+ * For further information, see the Documentation/hwmon/ads7828.rst file.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
diff --git a/include/linux/platform_data/ds620.h b/include/linux/platform_data/ds620.h
index 6ef58bb77e46..f0ce22a78bb8 100644
--- a/include/linux/platform_data/ds620.h
+++ b/include/linux/platform_data/ds620.h
@@ -14,7 +14,7 @@ struct ds620_platform_data {
 	 *  1 = PO_LOW
 	 *  2 = PO_HIGH
 	 *
-	 * (see Documentation/hwmon/ds620)
+	 * (see Documentation/hwmon/ds620.rst)
 	 */
 	int pomode;
 };
diff --git a/include/linux/platform_data/ina2xx.h b/include/linux/platform_data/ina2xx.h
index 9f0aa1b48c78..dde59fd3590f 100644
--- a/include/linux/platform_data/ina2xx.h
+++ b/include/linux/platform_data/ina2xx.h
@@ -7,7 +7,7 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  *
- * For further information, see the Documentation/hwmon/ina2xx file.
+ * For further information, see the Documentation/hwmon/ina2xx.rst file.
  */
 
 /**
diff --git a/include/linux/platform_data/max197.h b/include/linux/platform_data/max197.h
index 8da8f94ee15c..2bbd0919bc89 100644
--- a/include/linux/platform_data/max197.h
+++ b/include/linux/platform_data/max197.h
@@ -8,7 +8,7 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  *
- * For further information, see the Documentation/hwmon/max197 file.
+ * For further information, see the Documentation/hwmon/max197.rst file.
  */
 
 #ifndef _PDATA_MAX197_H
diff --git a/include/linux/platform_data/ntc_thermistor.h b/include/linux/platform_data/ntc_thermistor.h
index ee03d429742b..5fa115d3ea4b 100644
--- a/include/linux/platform_data/ntc_thermistor.h
+++ b/include/linux/platform_data/ntc_thermistor.h
@@ -42,7 +42,7 @@ struct ntc_thermistor_platform_data {
 	 * read_uV()
 	 *
 	 * How to setup pullup_ohm, pulldown_ohm, and connect is
-	 * described at Documentation/hwmon/ntc_thermistor
+	 * described at Documentation/hwmon/ntc_thermistor.rst
 	 *
 	 * pullup/down_ohm: 0 for infinite / not-connected
 	 *
-- 
2.20.1


^ permalink raw reply related

* [PATCH v2 00/21] Convert hwmon documentation to ReST
From: Mauro Carvalho Chehab @ 2019-04-10 19:22 UTC (permalink / raw)
  To: Linux Doc Mailing List
  Cc: linux-arm-kernel, linux-hwmon, Jean Delvare, linux-aspeed,
	Jonathan Corbet, Andrew Jeffery, Sudeep Holla, Liviu Dudau,
	linux-kernel, Mauro Carvalho Chehab, Lorenzo Pieralisi,
	Paul Mackerras, Joel Stanley, Mauro Carvalho Chehab, linuxppc-dev,
	Guenter Roeck

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=UTF-8, Size: 21522 bytes --]

This series converts the contents of Documentation/hwmon to ReST
format.

PS.: I opted to group the conversion files per groups of maintainer
set, as, if I were to generate one patch per file, it would give around
160 patches.

I also added those patches to my development tree at:
	https://git.linuxtv.org/mchehab/experimental.git/log/?h=hwmon

If you want to see the results, they're at:
	https://www.infradead.org/~mchehab/hwmon/

Version 2:

- Fixed broken SOB lines;
- changed submitting-patches.rst to mention that drivers should be
  documented as Documentation/hwmon/<driver_name>.rst,
  as suggested by Jonathan Neuschäfer.

Mauro Carvalho Chehab (21):
  docs: hwmon: k10temp: convert to ReST format
  docs: hwmon: vexpress: convert to ReST format
  docs: hwmon: menf21bmc: convert to ReST format
  docs: hwmon: sch5627: convert to ReST format
  docs: hwmon: emc2103: convert to ReST format
  docs: hwmon: pc87360: convert to ReST format
  docs: hwmon: fam15h_power: convert to ReST format
  docs: hwmon: w83791d: convert to ReST format
  docs: hwmon: coretemp: convert to ReST format
  docs: hwmon: aspeed-pwm-tacho: convert to ReST format
  docs: hwmon: ibmpowernv: convert to ReST format
  docs: hwmon: asc7621: convert to ReST format
  docs: hwmon: ads1015: convert to ReST format
  docs: hwmon: dme1737, vt1211: convert to ReST format
  docs: hwmon: wm831x, wm8350: convert to ReST format
  docs: hwmon: da9052, da9055: convert to ReST format
  docs: hwmon: k8temp, w83793: convert to ReST format
  docs: hwmon: pmbus files: convert to ReST format
  docs: hwmon: misc files: convert to ReST format
  docs: hwmon: convert remaining files to ReST format
  docs: hwmon: Add an index file and rename docs to *.rst

 .../devicetree/bindings/hwmon/g762.txt        |   2 +-
 Documentation/hwmon/{ab8500 => ab8500.rst}    |  10 +-
 Documentation/hwmon/abituguru                 |  92 ---
 ...guru-datasheet => abituguru-datasheet.rst} | 160 ++--
 Documentation/hwmon/abituguru.rst             | 113 +++
 .../hwmon/{abituguru3 => abituguru3.rst}      |  36 +-
 Documentation/hwmon/{abx500 => abx500.rst}    |   8 +-
 ...{acpi_power_meter => acpi_power_meter.rst} |  25 +-
 Documentation/hwmon/{ad7314 => ad7314.rst}    |   9 +
 .../hwmon/{adc128d818 => adc128d818.rst}      |   7 +-
 Documentation/hwmon/{adm1021 => adm1021.rst}  |  44 +-
 Documentation/hwmon/{adm1025 => adm1025.rst}  |  13 +-
 Documentation/hwmon/{adm1026 => adm1026.rst}  |  24 +-
 Documentation/hwmon/{adm1031 => adm1031.rst}  |  16 +-
 Documentation/hwmon/{adm1275 => adm1275.rst}  |  30 +-
 Documentation/hwmon/{adm9240 => adm9240.rst}  |  50 +-
 Documentation/hwmon/{ads1015 => ads1015.rst}  |  72 +-
 Documentation/hwmon/{ads7828 => ads7828.rst}  |  29 +-
 Documentation/hwmon/{adt7410 => adt7410.rst}  |  49 +-
 Documentation/hwmon/{adt7411 => adt7411.rst}  |  20 +-
 Documentation/hwmon/{adt7462 => adt7462.rst}  |  10 +-
 Documentation/hwmon/{adt7470 => adt7470.rst}  |   8 +-
 Documentation/hwmon/{adt7475 => adt7475.rst}  |  38 +-
 Documentation/hwmon/{amc6821 => amc6821.rst}  |  19 +-
 Documentation/hwmon/{asb100 => asb100.rst}    |  50 +-
 Documentation/hwmon/{asc7621 => asc7621.rst}  | 146 ++--
 ...{aspeed-pwm-tacho => aspeed-pwm-tacho.rst} |   2 +
 .../hwmon/{coretemp => coretemp.rst}          |  46 +-
 Documentation/hwmon/{da9052 => da9052.rst}    |  40 +-
 Documentation/hwmon/{da9055 => da9055.rst}    |  20 +-
 Documentation/hwmon/{dme1737 => dme1737.rst}  |  88 ++-
 Documentation/hwmon/{ds1621 => ds1621.rst}    | 154 ++--
 Documentation/hwmon/{ds620 => ds620.rst}      |  12 +-
 Documentation/hwmon/{emc1403 => emc1403.rst}  |  33 +-
 Documentation/hwmon/{emc2103 => emc2103.rst}  |   6 +-
 .../hwmon/{emc6w201 => emc6w201.rst}          |   5 +
 Documentation/hwmon/{f71805f => f71805f.rst}  |  36 +-
 .../hwmon/{f71882fg => f71882fg.rst}          |  56 +-
 .../hwmon/{fam15h_power => fam15h_power.rst}  |  85 ++-
 .../hwmon/{ftsteutates => ftsteutates.rst}    |  14 +-
 Documentation/hwmon/{g760a => g760a.rst}      |   4 +
 Documentation/hwmon/{g762 => g762.rst}        |  67 +-
 Documentation/hwmon/{gl518sm => gl518sm.rst}  |  21 +-
 Documentation/hwmon/{hih6130 => hih6130.rst}  |  14 +-
 ...on-kernel-api.txt => hwmon-kernel-api.rst} | 298 ++++----
 .../hwmon/{ibm-cffps => ibm-cffps.rst}        |   3 +
 Documentation/hwmon/{ibmaem => ibmaem.rst}    |  10 +-
 .../hwmon/{ibmpowernv => ibmpowernv.rst}      |   3 +
 Documentation/hwmon/{ina209 => ina209.rst}    |  18 +-
 Documentation/hwmon/{ina2xx => ina2xx.rst}    |  41 +-
 Documentation/hwmon/{ina3221 => ina3221.rst}  |  17 +-
 Documentation/hwmon/index.rst                 | 179 +++++
 Documentation/hwmon/{ir35221 => ir35221.rst}  |  12 +-
 Documentation/hwmon/{it87 => it87.rst}        | 102 ++-
 Documentation/hwmon/{jc42 => jc42.rst}        |  55 +-
 Documentation/hwmon/{k10temp => k10temp.rst}  |  37 +-
 Documentation/hwmon/{k8temp => k8temp.rst}    |  17 +-
 .../hwmon/{lineage-pem => lineage-pem.rst}    |  16 +-
 Documentation/hwmon/{lm25066 => lm25066.rst}  |  32 +-
 Documentation/hwmon/{lm63 => lm63.rst}        |  24 +-
 Documentation/hwmon/{lm70 => lm70.rst}        |  13 +-
 Documentation/hwmon/{lm73 => lm73.rst}        |  16 +-
 Documentation/hwmon/{lm75 => lm75.rst}        |  96 ++-
 Documentation/hwmon/{lm77 => lm77.rst}        |   9 +-
 Documentation/hwmon/{lm78 => lm78.rst}        |  20 +-
 Documentation/hwmon/{lm80 => lm80.rst}        |  19 +-
 Documentation/hwmon/{lm83 => lm83.rst}        |  16 +-
 Documentation/hwmon/{lm85 => lm85.rst}        |  97 ++-
 Documentation/hwmon/{lm87 => lm87.rst}        |  23 +-
 Documentation/hwmon/{lm90 => lm90.rst}        | 174 ++++-
 Documentation/hwmon/{lm92 => lm92.rst}        |  17 +-
 Documentation/hwmon/{lm93 => lm93.rst}        | 157 ++--
 Documentation/hwmon/{lm95234 => lm95234.rst}  |  11 +-
 Documentation/hwmon/{lm95245 => lm95245.rst}  |  13 +-
 Documentation/hwmon/{ltc2945 => ltc2945.rst}  |  16 +-
 Documentation/hwmon/{ltc2978 => ltc2978.rst}  | 267 +++++--
 Documentation/hwmon/{ltc2990 => ltc2990.rst}  |  23 +-
 Documentation/hwmon/{ltc3815 => ltc3815.rst}  |  12 +-
 Documentation/hwmon/{ltc4151 => ltc4151.rst}  |  16 +-
 Documentation/hwmon/{ltc4215 => ltc4215.rst}  |  16 +-
 Documentation/hwmon/{ltc4245 => ltc4245.rst}  |  17 +-
 Documentation/hwmon/{ltc4260 => ltc4260.rst}  |  16 +-
 Documentation/hwmon/{ltc4261 => ltc4261.rst}  |  16 +-
 .../hwmon/{max16064 => max16064.rst}          |  17 +-
 .../hwmon/{max16065 => max16065.rst}          |  24 +-
 Documentation/hwmon/{max1619 => max1619.rst}  |  11 +-
 Documentation/hwmon/{max1668 => max1668.rst}  |  14 +-
 Documentation/hwmon/{max197 => max197.rst}    |  36 +-
 .../hwmon/{max20751 => max20751.rst}          |   9 +-
 .../hwmon/{max31722 => max31722.rst}          |  12 +
 .../hwmon/{max31785 => max31785.rst}          |   6 +
 .../hwmon/{max31790 => max31790.rst}          |   6 +
 .../hwmon/{max34440 => max34440.rst}          |  90 ++-
 Documentation/hwmon/{max6639 => max6639.rst}  |  16 +-
 Documentation/hwmon/{max6642 => max6642.rst}  |  10 +-
 Documentation/hwmon/{max6650 => max6650.rst}  |  16 +-
 Documentation/hwmon/{max6697 => max6697.rst}  |  33 +
 Documentation/hwmon/{max8688 => max8688.rst}  |  20 +-
 .../hwmon/{mc13783-adc => mc13783-adc.rst}    |  27 +-
 Documentation/hwmon/{mcp3021 => mcp3021.rst}  |  15 +-
 .../hwmon/{menf21bmc => menf21bmc.rst}        |   5 +
 .../hwmon/{mlxreg-fan => mlxreg-fan.rst}      |  60 +-
 Documentation/hwmon/{nct6683 => nct6683.rst}  |  11 +-
 Documentation/hwmon/{nct6775 => nct6775.rst}  | 114 ++-
 Documentation/hwmon/{nct7802 => nct7802.rst}  |  11 +-
 Documentation/hwmon/{nct7904 => nct7904.rst}  |   9 +-
 .../{npcm750-pwm-fan => npcm750-pwm-fan.rst}  |   4 +
 Documentation/hwmon/{nsa320 => nsa320.rst}    |  15 +-
 .../{ntc_thermistor => ntc_thermistor.rst}    | 123 ++--
 Documentation/hwmon/{occ => occ.rst}          |  93 ++-
 Documentation/hwmon/{pc87360 => pc87360.rst}  |  38 +-
 Documentation/hwmon/{pc87427 => pc87427.rst}  |   4 +
 Documentation/hwmon/{pcf8591 => pcf8591.rst}  |  52 +-
 .../hwmon/{pmbus-core => pmbus-core.rst}      | 173 +++--
 Documentation/hwmon/{pmbus => pmbus.rst}      |  90 ++-
 .../hwmon/{powr1220 => powr1220.rst}          |  12 +-
 Documentation/hwmon/{pwm-fan => pwm-fan.rst}  |   0
 ...aspberrypi-hwmon => raspberrypi-hwmon.rst} |   3 +
 Documentation/hwmon/{sch5627 => sch5627.rst}  |   4 +
 Documentation/hwmon/{sch5636 => sch5636.rst}  |   3 +
 .../hwmon/{scpi-hwmon => scpi-hwmon.rst}      |   7 +-
 Documentation/hwmon/{sht15 => sht15.rst}      |  28 +-
 Documentation/hwmon/{sht21 => sht21.rst}      |  24 +-
 Documentation/hwmon/{sht3x => sht3x.rst}      |  42 +-
 Documentation/hwmon/{shtc1 => shtc1.rst}      |  19 +-
 Documentation/hwmon/{sis5595 => sis5595.rst}  |  40 +-
 Documentation/hwmon/{smm665 => smm665.rst}    |  42 +-
 .../hwmon/{smsc47b397 => smsc47b397.rst}      | 158 ++--
 .../hwmon/{smsc47m1 => smsc47m1.rst}          |  43 +-
 Documentation/hwmon/smsc47m192                | 103 ---
 Documentation/hwmon/smsc47m192.rst            | 116 +++
 ...mitting-patches => submitting-patches.rst} |  21 +-
 .../{sysfs-interface => sysfs-interface.rst}  | 696 ++++++++++++------
 Documentation/hwmon/{tc654 => tc654.rst}      |   9 +-
 Documentation/hwmon/{tc74 => tc74.rst}        |   3 +
 Documentation/hwmon/{thmc50 => thmc50.rst}    |  36 +-
 Documentation/hwmon/{tmp102 => tmp102.rst}    |   7 +-
 Documentation/hwmon/{tmp103 => tmp103.rst}    |   7 +-
 Documentation/hwmon/{tmp108 => tmp108.rst}    |   7 +-
 Documentation/hwmon/{tmp401 => tmp401.rst}    |  32 +-
 Documentation/hwmon/{tmp421 => tmp421.rst}    |  26 +-
 .../hwmon/{tps40422 => tps40422.rst}          |  25 +-
 ...4030-madc-hwmon => twl4030-madc-hwmon.rst} |   8 +-
 Documentation/hwmon/{ucd9000 => ucd9000.rst}  |  35 +-
 Documentation/hwmon/{ucd9200 => ucd9200.rst}  |  46 +-
 .../{userspace-tools => userspace-tools.rst}  |   3 +
 .../hwmon/{vexpress => vexpress.rst}          |  13 +-
 Documentation/hwmon/{via686a => via686a.rst}  |  30 +-
 Documentation/hwmon/{vt1211 => vt1211.rst}    |  84 ++-
 .../hwmon/{w83627ehf => w83627ehf.rst}        | 160 ++--
 .../hwmon/{w83627hf => w83627hf.rst}          |  65 +-
 Documentation/hwmon/{w83773g => w83773g.rst}  |  12 +-
 Documentation/hwmon/{w83781d => w83781d.rst}  | 330 +++++----
 Documentation/hwmon/{w83791d => w83791d.rst}  | 123 ++--
 Documentation/hwmon/{w83792d => w83792d.rst}  | 112 +--
 Documentation/hwmon/w83793                    | 106 ---
 Documentation/hwmon/w83793.rst                | 113 +++
 Documentation/hwmon/w83795                    | 127 ----
 Documentation/hwmon/w83795.rst                | 142 ++++
 .../hwmon/{w83l785ts => w83l785ts.rst}        |   9 +-
 .../hwmon/{w83l786ng => w83l786ng.rst}        |  42 +-
 Documentation/hwmon/{wm831x => wm831x.rst}    |   9 +-
 Documentation/hwmon/{wm8350 => wm8350.rst}    |  10 +-
 .../hwmon/{xgene-hwmon => xgene-hwmon.rst}    |  24 +-
 Documentation/hwmon/{zl6100 => zl6100.rst}    |  71 +-
 Documentation/index.rst                       |   1 +
 Documentation/thermal/sysfs-api.txt           |   2 +-
 MAINTAINERS                                   | 108 +--
 drivers/hwmon/Kconfig                         |   8 +-
 drivers/hwmon/ads7828.c                       |   2 +-
 drivers/hwmon/max197.c                        |   2 +-
 drivers/hwmon/sht15.c                         |   2 +-
 include/linux/platform_data/ads7828.h         |   2 +-
 include/linux/platform_data/ds620.h           |   2 +-
 include/linux/platform_data/ina2xx.h          |   2 +-
 include/linux/platform_data/max197.h          |   2 +-
 include/linux/platform_data/ntc_thermistor.h  |   2 +-
 177 files changed, 5604 insertions(+), 2609 deletions(-)
 rename Documentation/hwmon/{ab8500 => ab8500.rst} (69%)
 delete mode 100644 Documentation/hwmon/abituguru
 rename Documentation/hwmon/{abituguru-datasheet => abituguru-datasheet.rst} (69%)
 create mode 100644 Documentation/hwmon/abituguru.rst
 rename Documentation/hwmon/{abituguru3 => abituguru3.rst} (75%)
 rename Documentation/hwmon/{abx500 => abx500.rst} (89%)
 rename Documentation/hwmon/{acpi_power_meter => acpi_power_meter.rst} (65%)
 rename Documentation/hwmon/{ad7314 => ad7314.rst} (98%)
 rename Documentation/hwmon/{adc128d818 => adc128d818.rst} (95%)
 rename Documentation/hwmon/{adm1021 => adm1021.rst} (97%)
 rename Documentation/hwmon/{adm1025 => adm1025.rst} (96%)
 rename Documentation/hwmon/{adm1026 => adm1026.rst} (89%)
 rename Documentation/hwmon/{adm1031 => adm1031.rst} (80%)
 rename Documentation/hwmon/{adm1275 => adm1275.rst} (93%)
 rename Documentation/hwmon/{adm9240 => adm9240.rst} (85%)
 rename Documentation/hwmon/{ads1015 => ads1015.rst} (64%)
 rename Documentation/hwmon/{ads7828 => ads7828.rst} (68%)
 rename Documentation/hwmon/{adt7410 => adt7410.rst} (70%)
 rename Documentation/hwmon/{adt7411 => adt7411.rst} (67%)
 rename Documentation/hwmon/{adt7462 => adt7462.rst} (94%)
 rename Documentation/hwmon/{adt7470 => adt7470.rst} (95%)
 rename Documentation/hwmon/{adt7475 => adt7475.rst} (89%)
 rename Documentation/hwmon/{amc6821 => amc6821.rst} (90%)
 rename Documentation/hwmon/{asb100 => asb100.rst} (69%)
 rename Documentation/hwmon/{asc7621 => asc7621.rst} (80%)
 rename Documentation/hwmon/{aspeed-pwm-tacho => aspeed-pwm-tacho.rst} (79%)
 rename Documentation/hwmon/{coretemp => coretemp.rst} (78%)
 rename Documentation/hwmon/{da9052 => da9052.rst} (66%)
 rename Documentation/hwmon/{da9055 => da9055.rst} (80%)
 rename Documentation/hwmon/{dme1737 => dme1737.rst} (89%)
 rename Documentation/hwmon/{ds1621 => ds1621.rst} (68%)
 rename Documentation/hwmon/{ds620 => ds620.rst} (88%)
 rename Documentation/hwmon/{emc1403 => emc1403.rst} (83%)
 rename Documentation/hwmon/{emc2103 => emc2103.rst} (95%)
 rename Documentation/hwmon/{emc6w201 => emc6w201.rst} (99%)
 rename Documentation/hwmon/{f71805f => f71805f.rst} (88%)
 rename Documentation/hwmon/{f71882fg => f71882fg.rst} (97%)
 rename Documentation/hwmon/{fam15h_power => fam15h_power.rst} (63%)
 rename Documentation/hwmon/{ftsteutates => ftsteutates.rst} (65%)
 rename Documentation/hwmon/{g760a => g760a.rst} (99%)
 rename Documentation/hwmon/{g762 => g762.rst} (59%)
 rename Documentation/hwmon/{gl518sm => gl518sm.rst} (89%)
 rename Documentation/hwmon/{hih6130 => hih6130.rst} (85%)
 rename Documentation/hwmon/{hwmon-kernel-api.txt => hwmon-kernel-api.rst} (59%)
 rename Documentation/hwmon/{ibm-cffps => ibm-cffps.rst} (90%)
 rename Documentation/hwmon/{ibmaem => ibmaem.rst} (92%)
 rename Documentation/hwmon/{ibmpowernv => ibmpowernv.rst} (94%)
 rename Documentation/hwmon/{ina209 => ina209.rst} (90%)
 rename Documentation/hwmon/{ina2xx => ina2xx.rst} (81%)
 rename Documentation/hwmon/{ina3221 => ina3221.rst} (77%)
 create mode 100644 Documentation/hwmon/index.rst
 rename Documentation/hwmon/{ir35221 => ir35221.rst} (89%)
 rename Documentation/hwmon/{it87 => it87.rst} (92%)
 rename Documentation/hwmon/{jc42 => jc42.rst} (92%)
 rename Documentation/hwmon/{k10temp => k10temp.rst} (98%)
 rename Documentation/hwmon/{k8temp => k8temp.rst} (83%)
 rename Documentation/hwmon/{lineage-pem => lineage-pem.rst} (88%)
 rename Documentation/hwmon/{lm25066 => lm25066.rst} (91%)
 rename Documentation/hwmon/{lm63 => lm63.rst} (95%)
 rename Documentation/hwmon/{lm70 => lm70.rst} (96%)
 rename Documentation/hwmon/{lm73 => lm73.rst} (92%)
 rename Documentation/hwmon/{lm75 => lm75.rst} (80%)
 rename Documentation/hwmon/{lm77 => lm77.rst} (97%)
 rename Documentation/hwmon/{lm78 => lm78.rst} (95%)
 rename Documentation/hwmon/{lm80 => lm80.rst} (94%)
 rename Documentation/hwmon/{lm83 => lm83.rst} (95%)
 rename Documentation/hwmon/{lm85 => lm85.rst} (86%)
 rename Documentation/hwmon/{lm87 => lm87.rst} (89%)
 rename Documentation/hwmon/{lm90 => lm90.rst} (85%)
 rename Documentation/hwmon/{lm92 => lm92.rst} (90%)
 rename Documentation/hwmon/{lm93 => lm93.rst} (80%)
 rename Documentation/hwmon/{lm95234 => lm95234.rst} (94%)
 rename Documentation/hwmon/{lm95245 => lm95245.rst} (91%)
 rename Documentation/hwmon/{ltc2945 => ltc2945.rst} (89%)
 rename Documentation/hwmon/{ltc2978 => ltc2978.rst} (58%)
 rename Documentation/hwmon/{ltc2990 => ltc2990.rst} (76%)
 rename Documentation/hwmon/{ltc3815 => ltc3815.rst} (83%)
 rename Documentation/hwmon/{ltc4151 => ltc4151.rst} (80%)
 rename Documentation/hwmon/{ltc4215 => ltc4215.rst} (78%)
 rename Documentation/hwmon/{ltc4245 => ltc4245.rst} (89%)
 rename Documentation/hwmon/{ltc4260 => ltc4260.rst} (85%)
 rename Documentation/hwmon/{ltc4261 => ltc4261.rst} (88%)
 rename Documentation/hwmon/{max16064 => max16064.rst} (88%)
 rename Documentation/hwmon/{max16065 => max16065.rst} (95%)
 rename Documentation/hwmon/{max1619 => max1619.rst} (82%)
 rename Documentation/hwmon/{max1668 => max1668.rst} (85%)
 rename Documentation/hwmon/{max197 => max197.rst} (59%)
 rename Documentation/hwmon/{max20751 => max20751.rst} (89%)
 rename Documentation/hwmon/{max31722 => max31722.rst} (83%)
 rename Documentation/hwmon/{max31785 => max31785.rst} (92%)
 rename Documentation/hwmon/{max31790 => max31790.rst} (88%)
 rename Documentation/hwmon/{max34440 => max34440.rst} (77%)
 rename Documentation/hwmon/{max6639 => max6639.rst} (83%)
 rename Documentation/hwmon/{max6642 => max6642.rst} (82%)
 rename Documentation/hwmon/{max6650 => max6650.rst} (86%)
 rename Documentation/hwmon/{max6697 => max6697.rst} (91%)
 rename Documentation/hwmon/{max8688 => max8688.rst} (85%)
 rename Documentation/hwmon/{mc13783-adc => mc13783-adc.rst} (82%)
 rename Documentation/hwmon/{mcp3021 => mcp3021.rst} (90%)
 rename Documentation/hwmon/{menf21bmc => menf21bmc.rst} (93%)
 rename Documentation/hwmon/{mlxreg-fan => mlxreg-fan.rst} (53%)
 rename Documentation/hwmon/{nct6683 => nct6683.rst} (89%)
 rename Documentation/hwmon/{nct6775 => nct6775.rst} (86%)
 rename Documentation/hwmon/{nct7802 => nct7802.rst} (73%)
 rename Documentation/hwmon/{nct7904 => nct7904.rst} (88%)
 rename Documentation/hwmon/{npcm750-pwm-fan => npcm750-pwm-fan.rst} (79%)
 rename Documentation/hwmon/{nsa320 => nsa320.rst} (93%)
 rename Documentation/hwmon/{ntc_thermistor => ntc_thermistor.rst} (52%)
 rename Documentation/hwmon/{occ => occ.rst} (67%)
 rename Documentation/hwmon/{pc87360 => pc87360.rst} (88%)
 rename Documentation/hwmon/{pc87427 => pc87427.rst} (99%)
 rename Documentation/hwmon/{pcf8591 => pcf8591.rst} (62%)
 rename Documentation/hwmon/{pmbus-core => pmbus-core.rst} (68%)
 rename Documentation/hwmon/{pmbus => pmbus.rst} (88%)
 rename Documentation/hwmon/{powr1220 => powr1220.rst} (90%)
 rename Documentation/hwmon/{pwm-fan => pwm-fan.rst} (100%)
 rename Documentation/hwmon/{raspberrypi-hwmon => raspberrypi-hwmon.rst} (85%)
 rename Documentation/hwmon/{sch5627 => sch5627.rst} (99%)
 rename Documentation/hwmon/{sch5636 => sch5636.rst} (99%)
 rename Documentation/hwmon/{scpi-hwmon => scpi-hwmon.rst} (96%)
 rename Documentation/hwmon/{sht15 => sht15.rst} (74%)
 rename Documentation/hwmon/{sht21 => sht21.rst} (92%)
 rename Documentation/hwmon/{sht3x => sht3x.rst} (75%)
 rename Documentation/hwmon/{shtc1 => shtc1.rst} (94%)
 rename Documentation/hwmon/{sis5595 => sis5595.rst} (79%)
 rename Documentation/hwmon/{smm665 => smm665.rst} (92%)
 rename Documentation/hwmon/{smsc47b397 => smsc47b397.rst} (62%)
 rename Documentation/hwmon/{smsc47m1 => smsc47m1.rst} (77%)
 delete mode 100644 Documentation/hwmon/smsc47m192
 create mode 100644 Documentation/hwmon/smsc47m192.rst
 rename Documentation/hwmon/{submitting-patches => submitting-patches.rst} (93%)
 rename Documentation/hwmon/{sysfs-interface => sysfs-interface.rst} (70%)
 rename Documentation/hwmon/{tc654 => tc654.rst} (81%)
 rename Documentation/hwmon/{tc74 => tc74.rst} (99%)
 rename Documentation/hwmon/{thmc50 => thmc50.rst} (84%)
 rename Documentation/hwmon/{tmp102 => tmp102.rst} (92%)
 rename Documentation/hwmon/{tmp103 => tmp103.rst} (91%)
 rename Documentation/hwmon/{tmp108 => tmp108.rst} (95%)
 rename Documentation/hwmon/{tmp401 => tmp401.rst} (92%)
 rename Documentation/hwmon/{tmp421 => tmp421.rst} (96%)
 rename Documentation/hwmon/{tps40422 => tps40422.rst} (75%)
 rename Documentation/hwmon/{twl4030-madc-hwmon => twl4030-madc-hwmon.rst} (82%)
 rename Documentation/hwmon/{ucd9000 => ucd9000.rst} (87%)
 rename Documentation/hwmon/{ucd9200 => ucd9200.rst} (80%)
 rename Documentation/hwmon/{userspace-tools => userspace-tools.rst} (97%)
 rename Documentation/hwmon/{vexpress => vexpress.rst} (85%)
 rename Documentation/hwmon/{via686a => via686a.rst} (79%)
 rename Documentation/hwmon/{vt1211 => vt1211.rst} (73%)
 rename Documentation/hwmon/{w83627ehf => w83627ehf.rst} (64%)
 rename Documentation/hwmon/{w83627hf => w83627hf.rst} (73%)
 rename Documentation/hwmon/{w83773g => w83773g.rst} (91%)
 rename Documentation/hwmon/{w83781d => w83781d.rst} (66%)
 rename Documentation/hwmon/{w83791d => w83791d.rst} (59%)
 rename Documentation/hwmon/{w83792d => w83792d.rst} (78%)
 delete mode 100644 Documentation/hwmon/w83793
 create mode 100644 Documentation/hwmon/w83793.rst
 delete mode 100644 Documentation/hwmon/w83795
 create mode 100644 Documentation/hwmon/w83795.rst
 rename Documentation/hwmon/{w83l785ts => w83l785ts.rst} (91%)
 rename Documentation/hwmon/{w83l786ng => w83l786ng.rst} (64%)
 rename Documentation/hwmon/{wm831x => wm831x.rst} (86%)
 rename Documentation/hwmon/{wm8350 => wm8350.rst} (81%)
 rename Documentation/hwmon/{xgene-hwmon => xgene-hwmon.rst} (51%)
 rename Documentation/hwmon/{zl6100 => zl6100.rst} (83%)

-- 
2.20.1



^ permalink raw reply

* [PATCH v2 11/21] docs: hwmon: ibmpowernv: convert to ReST format
From: Mauro Carvalho Chehab @ 2019-04-10 19:22 UTC (permalink / raw)
  To: Linux Doc Mailing List
  Cc: linux-hwmon, Jean Delvare, Jonathan Corbet, linux-kernel,
	Mauro Carvalho Chehab, Paul Mackerras, Mauro Carvalho Chehab,
	linuxppc-dev, Guenter Roeck
In-Reply-To: <cover.1554923967.git.mchehab+samsung@kernel.org>

Convert ibmpowernv to ReST format, in order to allow it to
be parsed by Sphinx.

Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
---
 Documentation/hwmon/ibmpowernv | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/Documentation/hwmon/ibmpowernv b/Documentation/hwmon/ibmpowernv
index 56468258711f..3f1feae3901c 100644
--- a/Documentation/hwmon/ibmpowernv
+++ b/Documentation/hwmon/ibmpowernv
@@ -2,6 +2,7 @@ Kernel Driver IBMPOWERNV
 ========================
 
 Supported systems:
+
   * Any recent IBM P servers based on POWERNV platform
 
 Author: Neelesh Gupta
@@ -29,6 +30,7 @@ CONFIG_SENSORS_IBMPOWERNV. It can also be built as module 'ibmpowernv'.
 Sysfs attributes
 ----------------
 
+======================= =======================================================
 fanX_input		Measured RPM value.
 fanX_min		Threshold RPM for alert generation.
 fanX_fault		0: No fail condition
@@ -78,3 +80,4 @@ currX_enable		Enable/disable all current sensors belonging to the
 			0: Disable
 
 energyX_input		Cumulative energy (microJoule)
+======================= =======================================================
-- 
2.20.1


^ permalink raw reply related

* Re: [EXT] Re: [PATCH] ASoC: fsl_asrc: replace the process_option table with function
From: Nicolin Chen @ 2019-04-10 17:54 UTC (permalink / raw)
  To: S.j. Wang
  Cc: alsa-devel@alsa-project.org, timur@kernel.org,
	Xiubo.Lee@gmail.com, festevam@gmail.com, broonie@kernel.org,
	linuxppc-dev@lists.ozlabs.org
In-Reply-To: <VE1PR04MB6479A2AA38FB6A27E120A441E32E0@VE1PR04MB6479.eurprd04.prod.outlook.com>

On Wed, Apr 10, 2019 at 10:34:05AM +0000, S.j. Wang wrote:
> > On Wed, Apr 10, 2019 at 08:26:59AM +0000, S.j. Wang wrote:
> > > > Is it possible to update the table? It'd be way quicker to use
> > > > lookup table than real-time calculation all the time. I believe you
> > > > can simply calculate all the values out for 12KHz and 24KHz since
> > > > you have the function. If there are certain combinations of these
> > > > two not being supported, then we could mark it with a special value and
> > add an if-check to error out.
> > > >
> > >
> > > Yes,  but I think the function should be more flexible, if someday we
> > > need to support Other sample rate, only need to update the list.
> > 
> > Given the fact that the owner of the function cannot give more comments, I
> > feel the function wouldn't be very maintainable as none of us understands it
> > well. On the other hand, you'll need to update the supported I/O rate lists
> > anyway, so why not just update the table as well? The supported sample
> > rates from ALSA are limited too. Overall, I think that continue using a lookup
> > table wins.
> 
> Alsa support SNDRV_PCM_RATE_KNOT, we can define the rate that we want
> To support,  and use function is more flexible, and we have use the function
> Internally for long time, it is stable😊

OK. I will try to indulge it. Let's see your next version first.

^ permalink raw reply

* Re: [EXT] Re: [PATCH v2 1/3] ASoC: fsl_audmix: remove "model" attribute
From: Nicolin Chen @ 2019-04-10 17:51 UTC (permalink / raw)
  To: Viorel Suman
  Cc: mark.rutland@arm.com, devicetree@vger.kernel.org,
	alsa-devel@alsa-project.org, lgirdwood@gmail.com,
	timur@kernel.org, Xiubo.Lee@gmail.com, festevam@gmail.com,
	broonie@kernel.org, linux-kernel@vger.kernel.org, tiwai@suse.com,
	viorel.suman@gmail.com, Julia.Lawall@lip6.fr, robh+dt@kernel.org,
	dl-linux-imx, kernel@pengutronix.de, shawnguo@kernel.org,
	perex@perex.cz, linuxppc-dev@lists.ozlabs.org,
	s.hauer@pengutronix.de, linux-arm-kernel@lists.infradead.org
In-Reply-To: <1554892497.14997.13.camel@nxp.com>

On Wed, Apr 10, 2019 at 10:34:57AM +0000, Viorel Suman wrote:
> Hi Nicolin,
> 
> On Ma, 2019-04-09 at 21:29 -0700, Nicolin Chen wrote:
> > WARNING: This email was created outside of NXP. DO NOT CLICK links or
> > attachments unless you recognize the sender and know the content is
> > safe.
> > 
> > 
> > 
> > On Tue, Apr 09, 2019 at 11:27:39AM +0000, Viorel Suman wrote:
> > > 
> > > Use "of_device_id.data" to specify the machine driver
> > > instead of "model" DTS attribute.
> > > 
> > > Signed-off-by: Viorel Suman <viorel.suman@nxp.com>
> > Acked-by: Nicolin Chen <nicoleotsuka@gmail.com>
> > 
> > > 
> > > ---
> > >  sound/soc/fsl/fsl_audmix.c | 43 +++++++++++++++++++++++-----------
> > > ---------
> > >  1 file changed, 23 insertions(+), 20 deletions(-)
> > > 
> > > +     priv->pdev = platform_device_register_data(&pdev->dev, mdrv,
> > > 0, NULL,
> > > +                                                0);
> > Would you please send a separate patch to replace "pdev->dev"?
> 
> Thank you for review. Yes, will send V3.

Ah...when I said that, I was literally saying that you should
send a separate patch individually, not resend the series.

Now I see you sent v3/v4 almost at the same time as "Applied"
mails from Mark. And I am totally confused which version got
applied....

Please rebase your local tree and find out which version got
applied and then send the diff with a separate patch.

Thanks
Nicolin

^ permalink raw reply

* [PATCH v5 00/16] KVM: PPC: Book3S HV: add XIVE native exploitation mode
From: Cédric Le Goater @ 2019-04-10 17:04 UTC (permalink / raw)
  To: kvm-ppc
  Cc: kvm, Paul Mackerras, Cédric Le Goater, linuxppc-dev,
	David Gibson

Hello,

On the POWER9 processor, the XIVE interrupt controller can control
interrupt sources using MMIOs to trigger events, to EOI or to turn off
the sources. Priority management and interrupt acknowledgment is also
controlled by MMIO in the CPU presenter sub-engine.

PowerNV/baremetal Linux runs natively under XIVE but sPAPR guests need
special support from the hypervisor to do the same. This is called the
XIVE native exploitation mode and today, it can be activated under the
PowerPC Hypervisor, pHyp. However, Linux/KVM lacks XIVE native support
and still offers the old interrupt mode interface using a KVM device
implementing the XICS hcalls over XIVE.

The following series is proposal to add the same support under KVM.

A new KVM device is introduced for the XIVE native exploitation
mode. It reuses most of the XICS-over-XIVE glue implementation
structures which are internal to KVM but has a completely different
interface. A set of KVM device ioctls provide support for the
hypervisor calls, all handled in QEMU, to configure the sources and
the event queues. From there, all interrupt control is transferred to
the guest which can use MMIOs.

These MMIO regions (ESB and TIMA) are exposed to guests in QEMU,
similarly to VFIO, and the associated VMAs are populated dynamically
with the appropriate pages using a fault handler. These are now
implemented using mmap()s of the KVM device fd.

Migration has its own specific needs regarding memory. The patchset
provides a specific control to quiesce XIVE before capturing the
memory. The save and restore of the internal state is based on the
same ioctls used for the hcalls.

On a POWER9 sPAPR machine, the Client Architecture Support (CAS)
negotiation process determines whether the guest operates with a
interrupt controller using the XICS legacy model, as found on POWER8,
or in XIVE exploitation mode. Which means that the KVM interrupt
device should be created at run-time, after the machine has started.
This requires extra support from KVM to destroy KVM devices. It is
introduced at the end of the patchset and requires some attention.

This is based on Linux 5.1-rc4 and is a candidate for 5.2. The OPAL
patches have been merged now.


GitHub trees available here :
 
QEMU sPAPR:

  https://github.com/legoater/qemu/commits/xive-next
  
Linux/KVM:

  https://github.com/legoater/linux/commits/xive-5.1

Thanks,

C.

Caveats :

 - We should introduce a set of definitions common to XIVE and XICS
 - The XICS-over-XIVE device file book3s_xive.c could be renamed to
   book3s_xics_on_xive.c or book3s_xics_p9.c
 - The XICS-over-XIVE device still has locking issues in the setup.
 - xc->valid is not useful
 - xc->xive is not very useful either

Changes since v4:

 - add check on EQ page alignment
 - add requirement on KVM_XIVE_EQ_ALWAYS_NOTIFY
 - add documentation in Documentation/virtual/kvm/api.txt
 - remove 'destroy' method
 - introduce a 'release' device operation called when device fd is
   closed.
 - introduce a 'xive_devices' array under the VM to store kvmppc_xive
   objects until VM is destroyed.
 
Changes since v3:

 - removed a couple of useless includes
 - fix the test ont the initial setting of the EQ toggle bit : 0 -> 1
 - renamed qsize to qshift
 - renamed qpage to qaddr
 - checked host page size
 - limited flags to KVM_XIVE_EQ_ALWAYS_NOTIFY to fit sPAPR specs
 - Fixed xive_timaval description in documentation

Changes since v2:

 - removed extra OPAL call definitions
 - removed ->q_order setting. Only useful in the XICS-on-XIVE KVM
   device which allocates the EQs on behalf of the guest.
 - returned -ENXIO when VP base is invalid
 - made use of the xive_vp() macro to compute VP identifiers
 - reworked locking in kvmppc_xive_native_connect_vcpu() to fix races 
 - stop advertising KVM_CAP_PPC_IRQ_XIVE as support is not fully
   available yet
 - fixed comment on XIVE IRQ number space
 - removed usage of the __x_* macros
 - fixed locking on source block
 - fixed comments on the KVM device attribute definitions
 - handled MASKED EAS configuration
 - fixed check on supported EQ size to restrict to 64K pages
 - checked kvm_eq.flags that need to be zero
 - removed the OPAL call when EQ qtoggle bit and index are zero. 
 - reduced the size of kvmppc_one_reg timaval attribute to two u64s
 - stopped returning of the OS CAM line value
 
Changes since v1:

 - Better documentation (was missing)
 - Nested support. XIVE not advertised on non PowerNV platforms. This
   is a good way to test the fallback on QEMU emulated devices.
 - ESB and TIMA special mapping done using the KVM device fd
 - All hcalls moved to QEMU. Dropped the patch moving the hcall flags.
 - Reworked of the KVM device ioctl controls to support hcalls and
   migration needs to capture/save states
 - Merged the control syncing XIVE and marking the EQ page dirty
 - Fixed passthrough support using the KVM device file address_space
   to clear the ESB pages from the mapping
 - Misc enhancements and fixes 

Cédric Le Goater (16):
  powerpc/xive: add OPAL extensions for the XIVE native exploitation
    support
  KVM: PPC: Book3S HV: add a new KVM device for the XIVE native
    exploitation mode
  KVM: PPC: Book3S HV: XIVE: introduce a new capability
    KVM_CAP_PPC_IRQ_XIVE
  KVM: PPC: Book3S HV: XIVE: add a control to initialize a source
  KVM: PPC: Book3S HV: XIVE: add a control to configure a source
  KVM: PPC: Book3S HV: XIVE: add controls for the EQ configuration
  KVM: PPC: Book3S HV: XIVE: add a global reset control
  KVM: PPC: Book3S HV: XIVE: add a control to sync the sources
  KVM: PPC: Book3S HV: XIVE: add a control to dirty the XIVE EQ pages
  KVM: PPC: Book3S HV: XIVE: add get/set accessors for the VP XIVE state
  KVM: introduce a 'mmap' method for KVM devices
  KVM: PPC: Book3S HV: XIVE: add a TIMA mapping
  KVM: PPC: Book3S HV: XIVE: add a mapping for the source ESB pages
  KVM: PPC: Book3S HV: XIVE: add passthrough support
  KVM: PPC: Book3S HV: XIVE: activate XIVE exploitation mode
  KVM: PPC: Book3S HV: XIVE: introduce a 'release' device operation

 arch/powerpc/include/asm/kvm_host.h        |    3 +
 arch/powerpc/include/asm/kvm_ppc.h         |   32 +
 arch/powerpc/include/asm/opal-api.h        |    7 +-
 arch/powerpc/include/asm/opal.h            |    7 +
 arch/powerpc/include/asm/xive.h            |   17 +
 arch/powerpc/include/uapi/asm/kvm.h        |   46 +
 arch/powerpc/kvm/book3s_xive.h             |   37 +
 include/linux/kvm_host.h                   |    2 +
 include/uapi/linux/kvm.h                   |    3 +
 arch/powerpc/kvm/book3s.c                  |   31 +-
 arch/powerpc/kvm/book3s_xive.c             |  230 +++-
 arch/powerpc/kvm/book3s_xive_native.c      | 1243 ++++++++++++++++++++
 arch/powerpc/kvm/powerpc.c                 |   37 +
 arch/powerpc/platforms/powernv/opal-call.c |    3 +
 arch/powerpc/sysdev/xive/native.c          |  110 ++
 virt/kvm/kvm_main.c                        |   24 +
 Documentation/virtual/kvm/api.txt          |   10 +
 Documentation/virtual/kvm/devices/xive.txt |  197 ++++
 arch/powerpc/kvm/Makefile                  |    2 +-
 19 files changed, 1980 insertions(+), 61 deletions(-)
 create mode 100644 arch/powerpc/kvm/book3s_xive_native.c
 create mode 100644 Documentation/virtual/kvm/devices/xive.txt

-- 
2.20.1


^ permalink raw reply

* Re: [PATCH 0/4] Enabling secure boot on PowerNV systems
From: Matthew Garrett @ 2019-04-10 17:36 UTC (permalink / raw)
  To: Claudio Carvalho
  Cc: linux-efi, Ard Biesheuvel, Nayna Jain, Linux Kernel Mailing List,
	Matthew Garret, linuxppc-dev, Peter Jones, Paul Mackerras,
	Jeremy Kerr, linux-integrity
In-Reply-To: <28bfc0a7-9ae5-2c99-e472-ea53f856bafc@linux.ibm.com>

(Cc:ing Peter Jones)

On Tue, Apr 9, 2019 at 3:55 PM Claudio Carvalho <cclaudio@linux.ibm.com> wrote:
>
>
> On 4/5/19 7:19 PM, Matthew Garrett wrote:
> > Based on our experience doing this in UEFI, that's insufficient - you
> > want to be able to block individual binaries or leaf certificates
> > without dropping trust in an intermediate certificate entirely.
>
>
> We agree that a dbx would be useful for blacklisting particular kernels
> signed with given certificate. However, we have been avoiding doing so for
> the initial release of secure boot on OpenPOWER. We don't have individual
> firmware binaries in OpenPOWER. Kernels are currently the only concern for
> the OS secure boot certificates we're discussing here. Also, we have a very
> limited keystore space in POWER9.
>
> Petitboot doesn't have standardized OS kernel verification at all right
> now.  Having the capability even without dbx seems valuable.

I don't see the benefit in attempting to maintain compatibility with
existing tooling unless you're going to be *completely* compatible
with existing tooling. That means supporting dbx and dbt.

> >> The API is still a work in progress.  We are planning to publish a document
> >> describing the current API and overall design shortly.
> > Ok. How are the attributes interpreted by the API?
>
>
> We support a subset of standard EFI variable attributes, and we only use
> EFI variables that relate to secure boot. Our goal is not to implement
> UEFI.  However, we do seek to be compatible with user space tooling and
> reuse as much existing infrastructure as possible. We don’t support the
> following: EFI_VARIABLE_HARDWARE_ERROR_RECORD,
> EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS and
> EFI_VARIABLE_ENHANCED_AUTHENTICATED_ACCESS.

Ok. I think that's realistically fine.

>
> >
> >> Perhaps the biggest departure is that the secure variables are stored in
> >> flash memory that is not lockable.  In order to protect the secure
> >> variables, hashes of the flash regions where they're stored are written to
> >> TPM NVRAM indices.  The TPM NVRAM indices we use are write locked at
> >> runtime.  The sysadmin enqueues update commands in flash.  During the next
> >> boot, the firmware verifies and processes the commands to update the
> >> certificate store and accompanying integrity hashes in the TPM NVRAM
> >> indices and write locks them.  Before certificates read from flash are
> >> used, the certificate store is hashed and compared against the hashes
> >> stored from the TPM.  The one exception is the PK. We store it in a TPM
> >> NVRAM index by itself rather than flash because updates to it must be
> >> guaranteed to be atomic.
> > What's the behaviour if multiple updates are enqueued? Does reading
> > back show a mocked up updated variable or the original state?
>
>
> Our secure variable updates are only applied at boot time. If any one of
> them fails, they all fail.

So I do the following:

1) Boot
2) Extend the contents of db
3) Extend the contents of db again
4) Read back the contents of db through efivarfs
5) Reboot
6) Read back the contents of db through efivarfs

Is what I see in (4) and (6) the same? Does it contain the values form
both extensions?

> > I'm not really clear on the workflow here. Who's the administrator
> > authority? When would they be updating the second level of keys? If
> > there's no support for revocation, why would distributions need two
> > levels of key in the system database rather than just distributing a
> > single intermediate and signing their actual signing certs with that?
>
>
> In OpenPOWER systems, we enable our customers and business partners to
> establish and manage the platform key certificate, which is the root of our
> key hierarchy. From there, through the KEK, they can delegate authority to
> intermediate level organizations, e.g. distros or IT departments or
> business operations. Those intermediate level organizations then manage the
> code signing certificates in the DB. If this answer doesn’t address your
> question, can you please rephrase?

Why would the intermediate level organisations not just have entries
in db? The main reason we don't do it this way in UEFI is because we
need to support dbx, and if you're not supporting dbx I'm not sure I
see the benefit.

^ permalink raw reply

* [PATCH v5 12/16] KVM: PPC: Book3S HV: XIVE: add a TIMA mapping
From: Cédric Le Goater @ 2019-04-10 17:04 UTC (permalink / raw)
  To: kvm-ppc
  Cc: kvm, Paul Mackerras, Cédric Le Goater, linuxppc-dev,
	David Gibson
In-Reply-To: <20190410170448.3923-1-clg@kaod.org>

Each thread has an associated Thread Interrupt Management context
composed of a set of registers. These registers let the thread handle
priority management and interrupt acknowledgment. The most important
are :

    - Interrupt Pending Buffer     (IPB)
    - Current Processor Priority   (CPPR)
    - Notification Source Register (NSR)

They are exposed to software in four different pages each proposing a
view with a different privilege. The first page is for the physical
thread context and the second for the hypervisor. Only the third
(operating system) and the fourth (user level) are exposed the guest.

A custom VM fault handler will populate the VMA with the appropriate
pages, which should only be the OS page for now.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
---
 arch/powerpc/include/asm/xive.h            |  1 +
 arch/powerpc/include/uapi/asm/kvm.h        |  2 ++
 arch/powerpc/kvm/book3s_xive_native.c      | 39 ++++++++++++++++++++++
 arch/powerpc/sysdev/xive/native.c          | 11 ++++++
 Documentation/virtual/kvm/devices/xive.txt | 23 +++++++++++++
 5 files changed, 76 insertions(+)

diff --git a/arch/powerpc/include/asm/xive.h b/arch/powerpc/include/asm/xive.h
index c4e88abd3b67..eaf76f57023a 100644
--- a/arch/powerpc/include/asm/xive.h
+++ b/arch/powerpc/include/asm/xive.h
@@ -23,6 +23,7 @@
  * same offset regardless of where the code is executing
  */
 extern void __iomem *xive_tima;
+extern unsigned long xive_tima_os;
 
 /*
  * Offset in the TM area of our current execution level (provided by
diff --git a/arch/powerpc/include/uapi/asm/kvm.h b/arch/powerpc/include/uapi/asm/kvm.h
index cd3f16b70a2e..0998e8edc91a 100644
--- a/arch/powerpc/include/uapi/asm/kvm.h
+++ b/arch/powerpc/include/uapi/asm/kvm.h
@@ -720,4 +720,6 @@ struct kvm_ppc_xive_eq {
 
 #define KVM_XIVE_EQ_ALWAYS_NOTIFY	0x00000001
 
+#define KVM_XIVE_TIMA_PAGE_OFFSET	0
+
 #endif /* __LINUX_KVM_POWERPC_H */
diff --git a/arch/powerpc/kvm/book3s_xive_native.c b/arch/powerpc/kvm/book3s_xive_native.c
index 2f9d5e9439a6..f5314da0cb45 100644
--- a/arch/powerpc/kvm/book3s_xive_native.c
+++ b/arch/powerpc/kvm/book3s_xive_native.c
@@ -165,6 +165,44 @@ int kvmppc_xive_native_connect_vcpu(struct kvm_device *dev,
 	return rc;
 }
 
+static vm_fault_t xive_native_tima_fault(struct vm_fault *vmf)
+{
+	struct vm_area_struct *vma = vmf->vma;
+
+	switch (vmf->pgoff - vma->vm_pgoff) {
+	case 0: /* HW - forbid access */
+	case 1: /* HV - forbid access */
+		return VM_FAULT_SIGBUS;
+	case 2: /* OS */
+		vmf_insert_pfn(vma, vmf->address, xive_tima_os >> PAGE_SHIFT);
+		return VM_FAULT_NOPAGE;
+	case 3: /* USER - TODO */
+	default:
+		return VM_FAULT_SIGBUS;
+	}
+}
+
+static const struct vm_operations_struct xive_native_tima_vmops = {
+	.fault = xive_native_tima_fault,
+};
+
+static int kvmppc_xive_native_mmap(struct kvm_device *dev,
+				   struct vm_area_struct *vma)
+{
+	/* We only allow mappings at fixed offset for now */
+	if (vma->vm_pgoff == KVM_XIVE_TIMA_PAGE_OFFSET) {
+		if (vma_pages(vma) > 4)
+			return -EINVAL;
+		vma->vm_ops = &xive_native_tima_vmops;
+	} else {
+		return -EINVAL;
+	}
+
+	vma->vm_flags |= VM_IO | VM_PFNMAP;
+	vma->vm_page_prot = pgprot_noncached_wc(vma->vm_page_prot);
+	return 0;
+}
+
 static int kvmppc_xive_native_set_source(struct kvmppc_xive *xive, long irq,
 					 u64 addr)
 {
@@ -1050,6 +1088,7 @@ struct kvm_device_ops kvm_xive_native_ops = {
 	.set_attr = kvmppc_xive_native_set_attr,
 	.get_attr = kvmppc_xive_native_get_attr,
 	.has_attr = kvmppc_xive_native_has_attr,
+	.mmap = kvmppc_xive_native_mmap,
 };
 
 void kvmppc_xive_native_init_module(void)
diff --git a/arch/powerpc/sysdev/xive/native.c b/arch/powerpc/sysdev/xive/native.c
index 0c037e933e55..7782201e5fe8 100644
--- a/arch/powerpc/sysdev/xive/native.c
+++ b/arch/powerpc/sysdev/xive/native.c
@@ -521,6 +521,9 @@ u32 xive_native_default_eq_shift(void)
 }
 EXPORT_SYMBOL_GPL(xive_native_default_eq_shift);
 
+unsigned long xive_tima_os;
+EXPORT_SYMBOL_GPL(xive_tima_os);
+
 bool __init xive_native_init(void)
 {
 	struct device_node *np;
@@ -573,6 +576,14 @@ bool __init xive_native_init(void)
 	for_each_possible_cpu(cpu)
 		kvmppc_set_xive_tima(cpu, r.start, tima);
 
+	/* Resource 2 is OS window */
+	if (of_address_to_resource(np, 2, &r)) {
+		pr_err("Failed to get thread mgmnt area resource\n");
+		return false;
+	}
+
+	xive_tima_os = r.start;
+
 	/* Grab size of provisionning pages */
 	xive_parse_provisioning(np);
 
diff --git a/Documentation/virtual/kvm/devices/xive.txt b/Documentation/virtual/kvm/devices/xive.txt
index 525d1eebcf34..0cd7847ec38a 100644
--- a/Documentation/virtual/kvm/devices/xive.txt
+++ b/Documentation/virtual/kvm/devices/xive.txt
@@ -13,6 +13,29 @@ requires a POWER9 host and the guest OS should have support for the
 XIVE native exploitation interrupt mode. If not, it should run using
 the legacy interrupt mode, referred as XICS (POWER7/8).
 
+* Device Mappings
+
+  The KVM device exposes different MMIO ranges of the XIVE HW which
+  are required for interrupt management. These are exposed to the
+  guest in VMAs populated with a custom VM fault handler.
+
+  1. Thread Interrupt Management Area (TIMA)
+
+  Each thread has an associated Thread Interrupt Management context
+  composed of a set of registers. These registers let the thread
+  handle priority management and interrupt acknowledgment. The most
+  important are :
+
+      - Interrupt Pending Buffer     (IPB)
+      - Current Processor Priority   (CPPR)
+      - Notification Source Register (NSR)
+
+  They are exposed to software in four different pages each proposing
+  a view with a different privilege. The first page is for the
+  physical thread context and the second for the hypervisor. Only the
+  third (operating system) and the fourth (user level) are exposed the
+  guest.
+
 * Groups:
 
   1. KVM_DEV_XIVE_GRP_CTRL
-- 
2.20.1


^ permalink raw reply related

* [PATCH v5 08/16] KVM: PPC: Book3S HV: XIVE: add a control to sync the sources
From: Cédric Le Goater @ 2019-04-10 17:04 UTC (permalink / raw)
  To: kvm-ppc
  Cc: kvm, Paul Mackerras, Cédric Le Goater, linuxppc-dev,
	David Gibson
In-Reply-To: <20190410170448.3923-1-clg@kaod.org>

This control will be used by the H_INT_SYNC hcall from QEMU to flush
event notifications on the XIVE IC owning the source.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
---
 arch/powerpc/include/uapi/asm/kvm.h        |  1 +
 arch/powerpc/kvm/book3s_xive_native.c      | 36 ++++++++++++++++++++++
 Documentation/virtual/kvm/devices/xive.txt |  8 +++++
 3 files changed, 45 insertions(+)

diff --git a/arch/powerpc/include/uapi/asm/kvm.h b/arch/powerpc/include/uapi/asm/kvm.h
index f045f9dee42e..e4abe30f6fc6 100644
--- a/arch/powerpc/include/uapi/asm/kvm.h
+++ b/arch/powerpc/include/uapi/asm/kvm.h
@@ -683,6 +683,7 @@ struct kvm_ppc_cpu_char {
 #define KVM_DEV_XIVE_GRP_SOURCE		2	/* 64-bit source identifier */
 #define KVM_DEV_XIVE_GRP_SOURCE_CONFIG	3	/* 64-bit source identifier */
 #define KVM_DEV_XIVE_GRP_EQ_CONFIG	4	/* 64-bit EQ identifier */
+#define KVM_DEV_XIVE_GRP_SOURCE_SYNC	5       /* 64-bit source identifier */
 
 /* Layout of 64-bit XIVE source attribute values */
 #define KVM_XIVE_LEVEL_SENSITIVE	(1ULL << 0)
diff --git a/arch/powerpc/kvm/book3s_xive_native.c b/arch/powerpc/kvm/book3s_xive_native.c
index b9597d80c95a..65380416d101 100644
--- a/arch/powerpc/kvm/book3s_xive_native.c
+++ b/arch/powerpc/kvm/book3s_xive_native.c
@@ -335,6 +335,38 @@ static int kvmppc_xive_native_set_source_config(struct kvmppc_xive *xive,
 						       priority, masked, eisn);
 }
 
+static int kvmppc_xive_native_sync_source(struct kvmppc_xive *xive,
+					  long irq, u64 addr)
+{
+	struct kvmppc_xive_src_block *sb;
+	struct kvmppc_xive_irq_state *state;
+	struct xive_irq_data *xd;
+	u32 hw_num;
+	u16 src;
+	int rc = 0;
+
+	pr_devel("%s irq=0x%lx", __func__, irq);
+
+	sb = kvmppc_xive_find_source(xive, irq, &src);
+	if (!sb)
+		return -ENOENT;
+
+	state = &sb->irq_state[src];
+
+	rc = -EINVAL;
+
+	arch_spin_lock(&sb->lock);
+
+	if (state->valid) {
+		kvmppc_xive_select_irq(state, &hw_num, &xd);
+		xive_native_sync_source(hw_num);
+		rc = 0;
+	}
+
+	arch_spin_unlock(&sb->lock);
+	return rc;
+}
+
 static int xive_native_validate_queue_size(u32 qshift)
 {
 	/*
@@ -670,6 +702,9 @@ static int kvmppc_xive_native_set_attr(struct kvm_device *dev,
 	case KVM_DEV_XIVE_GRP_EQ_CONFIG:
 		return kvmppc_xive_native_set_queue_config(xive, attr->attr,
 							   attr->addr);
+	case KVM_DEV_XIVE_GRP_SOURCE_SYNC:
+		return kvmppc_xive_native_sync_source(xive, attr->attr,
+						      attr->addr);
 	}
 	return -ENXIO;
 }
@@ -699,6 +734,7 @@ static int kvmppc_xive_native_has_attr(struct kvm_device *dev,
 		break;
 	case KVM_DEV_XIVE_GRP_SOURCE:
 	case KVM_DEV_XIVE_GRP_SOURCE_CONFIG:
+	case KVM_DEV_XIVE_GRP_SOURCE_SYNC:
 		if (attr->attr >= KVMPPC_XIVE_FIRST_IRQ &&
 		    attr->attr < KVMPPC_XIVE_NR_IRQS)
 			return 0;
diff --git a/Documentation/virtual/kvm/devices/xive.txt b/Documentation/virtual/kvm/devices/xive.txt
index 429cbc4cf960..1e7f19d7594b 100644
--- a/Documentation/virtual/kvm/devices/xive.txt
+++ b/Documentation/virtual/kvm/devices/xive.txt
@@ -92,3 +92,11 @@ the legacy interrupt mode, referred as XICS (POWER7/8).
     -EINVAL: Invalid queue address
     -EFAULT: Invalid user pointer for attr->addr.
     -EIO:    Configuration of the underlying HW failed
+
+  5. KVM_DEV_XIVE_GRP_SOURCE_SYNC (write only)
+  Synchronize the source to flush event notifications
+  Attributes:
+    Interrupt source number  (64-bit)
+  Errors:
+    -ENOENT: Unknown source number
+    -EINVAL: Not initialized source number
-- 
2.20.1


^ permalink raw reply related

* [PATCH v5 07/16] KVM: PPC: Book3S HV: XIVE: add a global reset control
From: Cédric Le Goater @ 2019-04-10 17:04 UTC (permalink / raw)
  To: kvm-ppc
  Cc: kvm, Paul Mackerras, Cédric Le Goater, linuxppc-dev,
	David Gibson
In-Reply-To: <20190410170448.3923-1-clg@kaod.org>

This control is to be used by the H_INT_RESET hcall from QEMU. Its
purpose is to clear all configuration of the sources and EQs. This is
necessary in case of a kexec (for a kdump kernel for instance) to make
sure that no remaining configuration is left from the previous boot
setup so that the new kernel can start safely from a clean state.

The queue 7 is ignored when the XIVE device is configured to run in
single escalation mode. Prio 7 is used by escalations.

The XIVE VP is kept enabled as the vCPU is still active and connected
to the XIVE device.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
---
 arch/powerpc/include/uapi/asm/kvm.h        |  1 +
 arch/powerpc/kvm/book3s_xive_native.c      | 85 ++++++++++++++++++++++
 Documentation/virtual/kvm/devices/xive.txt |  5 ++
 3 files changed, 91 insertions(+)

diff --git a/arch/powerpc/include/uapi/asm/kvm.h b/arch/powerpc/include/uapi/asm/kvm.h
index 85005400fd86..f045f9dee42e 100644
--- a/arch/powerpc/include/uapi/asm/kvm.h
+++ b/arch/powerpc/include/uapi/asm/kvm.h
@@ -679,6 +679,7 @@ struct kvm_ppc_cpu_char {
 
 /* POWER9 XIVE Native Interrupt Controller */
 #define KVM_DEV_XIVE_GRP_CTRL		1
+#define   KVM_DEV_XIVE_RESET		1
 #define KVM_DEV_XIVE_GRP_SOURCE		2	/* 64-bit source identifier */
 #define KVM_DEV_XIVE_GRP_SOURCE_CONFIG	3	/* 64-bit source identifier */
 #define KVM_DEV_XIVE_GRP_EQ_CONFIG	4	/* 64-bit EQ identifier */
diff --git a/arch/powerpc/kvm/book3s_xive_native.c b/arch/powerpc/kvm/book3s_xive_native.c
index 3e7cdcacc932..b9597d80c95a 100644
--- a/arch/powerpc/kvm/book3s_xive_native.c
+++ b/arch/powerpc/kvm/book3s_xive_native.c
@@ -572,6 +572,83 @@ static int kvmppc_xive_native_get_queue_config(struct kvmppc_xive *xive,
 	return 0;
 }
 
+static void kvmppc_xive_reset_sources(struct kvmppc_xive_src_block *sb)
+{
+	int i;
+
+	for (i = 0; i < KVMPPC_XICS_IRQ_PER_ICS; i++) {
+		struct kvmppc_xive_irq_state *state = &sb->irq_state[i];
+
+		if (!state->valid)
+			continue;
+
+		if (state->act_priority == MASKED)
+			continue;
+
+		state->eisn = 0;
+		state->act_server = 0;
+		state->act_priority = MASKED;
+		xive_vm_esb_load(&state->ipi_data, XIVE_ESB_SET_PQ_01);
+		xive_native_configure_irq(state->ipi_number, 0, MASKED, 0);
+		if (state->pt_number) {
+			xive_vm_esb_load(state->pt_data, XIVE_ESB_SET_PQ_01);
+			xive_native_configure_irq(state->pt_number,
+						  0, MASKED, 0);
+		}
+	}
+}
+
+static int kvmppc_xive_reset(struct kvmppc_xive *xive)
+{
+	struct kvm *kvm = xive->kvm;
+	struct kvm_vcpu *vcpu;
+	unsigned int i;
+
+	pr_devel("%s\n", __func__);
+
+	mutex_lock(&kvm->lock);
+
+	kvm_for_each_vcpu(i, vcpu, kvm) {
+		struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
+		unsigned int prio;
+
+		if (!xc)
+			continue;
+
+		kvmppc_xive_disable_vcpu_interrupts(vcpu);
+
+		for (prio = 0; prio < KVMPPC_XIVE_Q_COUNT; prio++) {
+
+			/* Single escalation, no queue 7 */
+			if (prio == 7 && xive->single_escalation)
+				break;
+
+			if (xc->esc_virq[prio]) {
+				free_irq(xc->esc_virq[prio], vcpu);
+				irq_dispose_mapping(xc->esc_virq[prio]);
+				kfree(xc->esc_virq_names[prio]);
+				xc->esc_virq[prio] = 0;
+			}
+
+			kvmppc_xive_native_cleanup_queue(vcpu, prio);
+		}
+	}
+
+	for (i = 0; i <= xive->max_sbid; i++) {
+		struct kvmppc_xive_src_block *sb = xive->src_blocks[i];
+
+		if (sb) {
+			arch_spin_lock(&sb->lock);
+			kvmppc_xive_reset_sources(sb);
+			arch_spin_unlock(&sb->lock);
+		}
+	}
+
+	mutex_unlock(&kvm->lock);
+
+	return 0;
+}
+
 static int kvmppc_xive_native_set_attr(struct kvm_device *dev,
 				       struct kvm_device_attr *attr)
 {
@@ -579,6 +656,10 @@ static int kvmppc_xive_native_set_attr(struct kvm_device *dev,
 
 	switch (attr->group) {
 	case KVM_DEV_XIVE_GRP_CTRL:
+		switch (attr->attr) {
+		case KVM_DEV_XIVE_RESET:
+			return kvmppc_xive_reset(xive);
+		}
 		break;
 	case KVM_DEV_XIVE_GRP_SOURCE:
 		return kvmppc_xive_native_set_source(xive, attr->attr,
@@ -611,6 +692,10 @@ static int kvmppc_xive_native_has_attr(struct kvm_device *dev,
 {
 	switch (attr->group) {
 	case KVM_DEV_XIVE_GRP_CTRL:
+		switch (attr->attr) {
+		case KVM_DEV_XIVE_RESET:
+			return 0;
+		}
 		break;
 	case KVM_DEV_XIVE_GRP_SOURCE:
 	case KVM_DEV_XIVE_GRP_SOURCE_CONFIG:
diff --git a/Documentation/virtual/kvm/devices/xive.txt b/Documentation/virtual/kvm/devices/xive.txt
index cc13bfd5cf53..429cbc4cf960 100644
--- a/Documentation/virtual/kvm/devices/xive.txt
+++ b/Documentation/virtual/kvm/devices/xive.txt
@@ -17,6 +17,11 @@ the legacy interrupt mode, referred as XICS (POWER7/8).
 
   1. KVM_DEV_XIVE_GRP_CTRL
   Provides global controls on the device
+  Attributes:
+    1.1 KVM_DEV_XIVE_RESET (write only)
+    Resets the interrupt controller configuration for sources and event
+    queues. To be used by kexec and kdump.
+    Errors: none
 
   2. KVM_DEV_XIVE_GRP_SOURCE (write only)
   Initializes a new source in the XIVE device and mask it.
-- 
2.20.1


^ permalink raw reply related

* [PATCH v5 15/16] KVM: PPC: Book3S HV: XIVE: activate XIVE exploitation mode
From: Cédric Le Goater @ 2019-04-10 17:04 UTC (permalink / raw)
  To: kvm-ppc
  Cc: kvm, Paul Mackerras, Cédric Le Goater, linuxppc-dev,
	David Gibson
In-Reply-To: <20190410170448.3923-1-clg@kaod.org>

Full support for the XIVE native exploitation mode is now available,
advertise the capability KVM_CAP_PPC_IRQ_XIVE for guests running on
PowerNV KVM Hypervisors only. Support for nested guests (pseries KVM
Hypervisor) is not yet available. XIVE should also have been activated
which is default setting on POWER9 systems running a recent Linux
kernel.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
---
 arch/powerpc/kvm/powerpc.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index b0858ee61460..f54926c78320 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -573,10 +573,11 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
 #ifdef CONFIG_KVM_XIVE
 	case KVM_CAP_PPC_IRQ_XIVE:
 		/*
-		 * Return false until all the XIVE infrastructure is
-		 * in place including support for migration.
+		 * We need XIVE to be enabled on the platform (implies
+		 * a POWER9 processor) and the PowerNV platform, as
+		 * nested is not yet supported.
 		 */
-		r = 0;
+		r = xive_enabled() && !!cpu_has_feature(CPU_FTR_HVMODE);
 		break;
 #endif
 
-- 
2.20.1


^ permalink raw reply related

* [PATCH v5 09/16] KVM: PPC: Book3S HV: XIVE: add a control to dirty the XIVE EQ pages
From: Cédric Le Goater @ 2019-04-10 17:04 UTC (permalink / raw)
  To: kvm-ppc
  Cc: kvm, Paul Mackerras, Cédric Le Goater, linuxppc-dev,
	David Gibson
In-Reply-To: <20190410170448.3923-1-clg@kaod.org>

When migration of a VM is initiated, a first copy of the RAM is
transferred to the destination before the VM is stopped, but there is
no guarantee that the EQ pages in which the event notifications are
queued have not been modified.

To make sure migration will capture a consistent memory state, the
XIVE device should perform a XIVE quiesce sequence to stop the flow of
event notifications and stabilize the EQs. This is the purpose of the
KVM_DEV_XIVE_EQ_SYNC control which will also marks the EQ pages dirty
to force their transfer.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
---
 arch/powerpc/include/uapi/asm/kvm.h        |  1 +
 arch/powerpc/kvm/book3s_xive_native.c      | 85 ++++++++++++++++++++++
 Documentation/virtual/kvm/devices/xive.txt | 29 ++++++++
 3 files changed, 115 insertions(+)

diff --git a/arch/powerpc/include/uapi/asm/kvm.h b/arch/powerpc/include/uapi/asm/kvm.h
index e4abe30f6fc6..12744608a61c 100644
--- a/arch/powerpc/include/uapi/asm/kvm.h
+++ b/arch/powerpc/include/uapi/asm/kvm.h
@@ -680,6 +680,7 @@ struct kvm_ppc_cpu_char {
 /* POWER9 XIVE Native Interrupt Controller */
 #define KVM_DEV_XIVE_GRP_CTRL		1
 #define   KVM_DEV_XIVE_RESET		1
+#define   KVM_DEV_XIVE_EQ_SYNC		2
 #define KVM_DEV_XIVE_GRP_SOURCE		2	/* 64-bit source identifier */
 #define KVM_DEV_XIVE_GRP_SOURCE_CONFIG	3	/* 64-bit source identifier */
 #define KVM_DEV_XIVE_GRP_EQ_CONFIG	4	/* 64-bit EQ identifier */
diff --git a/arch/powerpc/kvm/book3s_xive_native.c b/arch/powerpc/kvm/book3s_xive_native.c
index 65380416d101..16d23ef3bd39 100644
--- a/arch/powerpc/kvm/book3s_xive_native.c
+++ b/arch/powerpc/kvm/book3s_xive_native.c
@@ -681,6 +681,88 @@ static int kvmppc_xive_reset(struct kvmppc_xive *xive)
 	return 0;
 }
 
+static void kvmppc_xive_native_sync_sources(struct kvmppc_xive_src_block *sb)
+{
+	int j;
+
+	for (j = 0; j < KVMPPC_XICS_IRQ_PER_ICS; j++) {
+		struct kvmppc_xive_irq_state *state = &sb->irq_state[j];
+		struct xive_irq_data *xd;
+		u32 hw_num;
+
+		if (!state->valid)
+			continue;
+
+		/*
+		 * The struct kvmppc_xive_irq_state reflects the state
+		 * of the EAS configuration and not the state of the
+		 * source. The source is masked setting the PQ bits to
+		 * '-Q', which is what is being done before calling
+		 * the KVM_DEV_XIVE_EQ_SYNC control.
+		 *
+		 * If a source EAS is configured, OPAL syncs the XIVE
+		 * IC of the source and the XIVE IC of the previous
+		 * target if any.
+		 *
+		 * So it should be fine ignoring MASKED sources as
+		 * they have been synced already.
+		 */
+		if (state->act_priority == MASKED)
+			continue;
+
+		kvmppc_xive_select_irq(state, &hw_num, &xd);
+		xive_native_sync_source(hw_num);
+		xive_native_sync_queue(hw_num);
+	}
+}
+
+static int kvmppc_xive_native_vcpu_eq_sync(struct kvm_vcpu *vcpu)
+{
+	struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
+	unsigned int prio;
+
+	if (!xc)
+		return -ENOENT;
+
+	for (prio = 0; prio < KVMPPC_XIVE_Q_COUNT; prio++) {
+		struct xive_q *q = &xc->queues[prio];
+
+		if (!q->qpage)
+			continue;
+
+		/* Mark EQ page dirty for migration */
+		mark_page_dirty(vcpu->kvm, gpa_to_gfn(q->guest_qaddr));
+	}
+	return 0;
+}
+
+static int kvmppc_xive_native_eq_sync(struct kvmppc_xive *xive)
+{
+	struct kvm *kvm = xive->kvm;
+	struct kvm_vcpu *vcpu;
+	unsigned int i;
+
+	pr_devel("%s\n", __func__);
+
+	mutex_lock(&kvm->lock);
+	for (i = 0; i <= xive->max_sbid; i++) {
+		struct kvmppc_xive_src_block *sb = xive->src_blocks[i];
+
+		if (sb) {
+			arch_spin_lock(&sb->lock);
+			kvmppc_xive_native_sync_sources(sb);
+			arch_spin_unlock(&sb->lock);
+		}
+	}
+
+	kvm_for_each_vcpu(i, vcpu, kvm) {
+		kvmppc_xive_native_vcpu_eq_sync(vcpu);
+	}
+	mutex_unlock(&kvm->lock);
+
+	return 0;
+}
+
 static int kvmppc_xive_native_set_attr(struct kvm_device *dev,
 				       struct kvm_device_attr *attr)
 {
@@ -691,6 +773,8 @@ static int kvmppc_xive_native_set_attr(struct kvm_device *dev,
 		switch (attr->attr) {
 		case KVM_DEV_XIVE_RESET:
 			return kvmppc_xive_reset(xive);
+		case KVM_DEV_XIVE_EQ_SYNC:
+			return kvmppc_xive_native_eq_sync(xive);
 		}
 		break;
 	case KVM_DEV_XIVE_GRP_SOURCE:
@@ -729,6 +813,7 @@ static int kvmppc_xive_native_has_attr(struct kvm_device *dev,
 	case KVM_DEV_XIVE_GRP_CTRL:
 		switch (attr->attr) {
 		case KVM_DEV_XIVE_RESET:
+		case KVM_DEV_XIVE_EQ_SYNC:
 			return 0;
 		}
 		break;
diff --git a/Documentation/virtual/kvm/devices/xive.txt b/Documentation/virtual/kvm/devices/xive.txt
index 1e7f19d7594b..7ffd4c7be7b5 100644
--- a/Documentation/virtual/kvm/devices/xive.txt
+++ b/Documentation/virtual/kvm/devices/xive.txt
@@ -23,6 +23,12 @@ the legacy interrupt mode, referred as XICS (POWER7/8).
     queues. To be used by kexec and kdump.
     Errors: none
 
+    1.2 KVM_DEV_XIVE_EQ_SYNC (write only)
+    Sync all the sources and queues and mark the EQ pages dirty. This
+    to make sure that a consistent memory state is captured when
+    migrating the VM.
+    Errors: none
+
   2. KVM_DEV_XIVE_GRP_SOURCE (write only)
   Initializes a new source in the XIVE device and mask it.
   Attributes:
@@ -100,3 +106,26 @@ the legacy interrupt mode, referred as XICS (POWER7/8).
   Errors:
     -ENOENT: Unknown source number
     -EINVAL: Not initialized source number
+
+* Migration:
+
+  Saving the state of a VM using the XIVE native exploitation mode
+  should follow a specific sequence. When the VM is stopped :
+
+  1. Mask all sources (PQ=01) to stop the flow of events.
+
+  2. Sync the XIVE device with the KVM control KVM_DEV_XIVE_EQ_SYNC to
+  flush any in-flight event notification and to stabilize the EQs. At
+  this stage, the EQ pages are marked dirty to make sure they are
+  transferred in the migration sequence.
+
+  3. Capture the state of the source targeting, the EQs configuration
+  and the state of thread interrupt context registers.
+
+  Restore is similar :
+
+  1. Restore the EQ configuration. As targeting depends on it.
+  2. Restore targeting
+  3. Restore the thread interrupt contexts
+  4. Restore the source states
+  5. Let the vCPU run
-- 
2.20.1


^ permalink raw reply related

* [PATCH v5 02/16] KVM: PPC: Book3S HV: add a new KVM device for the XIVE native exploitation mode
From: Cédric Le Goater @ 2019-04-10 17:04 UTC (permalink / raw)
  To: kvm-ppc
  Cc: kvm, Paul Mackerras, Cédric Le Goater, linuxppc-dev,
	David Gibson
In-Reply-To: <20190410170448.3923-1-clg@kaod.org>

This is the basic framework for the new KVM device supporting the XIVE
native exploitation mode. The user interface exposes a new KVM device
to be created by QEMU, only available when running on a L0 hypervisor.
Support for nested guests is not available yet.

The XIVE device reuses the device structure of the XICS-on-XIVE device
as they have a lot in common. That could possibly change in the future
if the need arise.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
---
 arch/powerpc/include/asm/kvm_host.h        |   1 +
 arch/powerpc/include/asm/kvm_ppc.h         |   8 +
 arch/powerpc/include/uapi/asm/kvm.h        |   3 +
 include/uapi/linux/kvm.h                   |   2 +
 arch/powerpc/kvm/book3s.c                  |   7 +-
 arch/powerpc/kvm/book3s_xive_native.c      | 179 +++++++++++++++++++++
 Documentation/virtual/kvm/devices/xive.txt |  19 +++
 arch/powerpc/kvm/Makefile                  |   2 +-
 8 files changed, 219 insertions(+), 2 deletions(-)
 create mode 100644 arch/powerpc/kvm/book3s_xive_native.c
 create mode 100644 Documentation/virtual/kvm/devices/xive.txt

diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h
index e6b5bb012ccb..008523224e7a 100644
--- a/arch/powerpc/include/asm/kvm_host.h
+++ b/arch/powerpc/include/asm/kvm_host.h
@@ -222,6 +222,7 @@ extern struct kvm_device_ops kvm_xics_ops;
 struct kvmppc_xive;
 struct kvmppc_xive_vcpu;
 extern struct kvm_device_ops kvm_xive_ops;
+extern struct kvm_device_ops kvm_xive_native_ops;
 
 struct kvmppc_passthru_irqmap;
 
diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h
index ac22b28ae78d..f3383e76017a 100644
--- a/arch/powerpc/include/asm/kvm_ppc.h
+++ b/arch/powerpc/include/asm/kvm_ppc.h
@@ -594,6 +594,10 @@ extern int kvmppc_xive_set_icp(struct kvm_vcpu *vcpu, u64 icpval);
 extern int kvmppc_xive_set_irq(struct kvm *kvm, int irq_source_id, u32 irq,
 			       int level, bool line_status);
 extern void kvmppc_xive_push_vcpu(struct kvm_vcpu *vcpu);
+
+extern void kvmppc_xive_native_init_module(void);
+extern void kvmppc_xive_native_exit_module(void);
+
 #else
 static inline int kvmppc_xive_set_xive(struct kvm *kvm, u32 irq, u32 server,
 				       u32 priority) { return -1; }
@@ -617,6 +621,10 @@ static inline int kvmppc_xive_set_icp(struct kvm_vcpu *vcpu, u64 icpval) { retur
 static inline int kvmppc_xive_set_irq(struct kvm *kvm, int irq_source_id, u32 irq,
 				      int level, bool line_status) { return -ENODEV; }
 static inline void kvmppc_xive_push_vcpu(struct kvm_vcpu *vcpu) { }
+
+static inline void kvmppc_xive_native_init_module(void) { }
+static inline void kvmppc_xive_native_exit_module(void) { }
+
 #endif /* CONFIG_KVM_XIVE */
 
 #if defined(CONFIG_PPC_POWERNV) && defined(CONFIG_KVM_BOOK3S_64_HANDLER)
diff --git a/arch/powerpc/include/uapi/asm/kvm.h b/arch/powerpc/include/uapi/asm/kvm.h
index 26ca425f4c2c..be0ce1f17625 100644
--- a/arch/powerpc/include/uapi/asm/kvm.h
+++ b/arch/powerpc/include/uapi/asm/kvm.h
@@ -677,4 +677,7 @@ struct kvm_ppc_cpu_char {
 #define  KVM_XICS_PRESENTED		(1ULL << 43)
 #define  KVM_XICS_QUEUED		(1ULL << 44)
 
+/* POWER9 XIVE Native Interrupt Controller */
+#define KVM_DEV_XIVE_GRP_CTRL		1
+
 #endif /* __LINUX_KVM_POWERPC_H */
diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h
index 6d4ea4b6c922..e6368163d3a0 100644
--- a/include/uapi/linux/kvm.h
+++ b/include/uapi/linux/kvm.h
@@ -1211,6 +1211,8 @@ enum kvm_device_type {
 #define KVM_DEV_TYPE_ARM_VGIC_V3	KVM_DEV_TYPE_ARM_VGIC_V3
 	KVM_DEV_TYPE_ARM_VGIC_ITS,
 #define KVM_DEV_TYPE_ARM_VGIC_ITS	KVM_DEV_TYPE_ARM_VGIC_ITS
+	KVM_DEV_TYPE_XIVE,
+#define KVM_DEV_TYPE_XIVE		KVM_DEV_TYPE_XIVE
 	KVM_DEV_TYPE_MAX,
 };
 
diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c
index 10c5579d20ce..7c3348fa27e1 100644
--- a/arch/powerpc/kvm/book3s.c
+++ b/arch/powerpc/kvm/book3s.c
@@ -1050,6 +1050,9 @@ static int kvmppc_book3s_init(void)
 	if (xics_on_xive()) {
 		kvmppc_xive_init_module();
 		kvm_register_device_ops(&kvm_xive_ops, KVM_DEV_TYPE_XICS);
+		kvmppc_xive_native_init_module();
+		kvm_register_device_ops(&kvm_xive_native_ops,
+					KVM_DEV_TYPE_XIVE);
 	} else
 #endif
 		kvm_register_device_ops(&kvm_xics_ops, KVM_DEV_TYPE_XICS);
@@ -1060,8 +1063,10 @@ static int kvmppc_book3s_init(void)
 static void kvmppc_book3s_exit(void)
 {
 #ifdef CONFIG_KVM_XICS
-	if (xics_on_xive())
+	if (xics_on_xive()) {
 		kvmppc_xive_exit_module();
+		kvmppc_xive_native_exit_module();
+	}
 #endif
 #ifdef CONFIG_KVM_BOOK3S_32_HANDLER
 	kvmppc_book3s_exit_pr();
diff --git a/arch/powerpc/kvm/book3s_xive_native.c b/arch/powerpc/kvm/book3s_xive_native.c
new file mode 100644
index 000000000000..751259394150
--- /dev/null
+++ b/arch/powerpc/kvm/book3s_xive_native.c
@@ -0,0 +1,179 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2017-2019, IBM Corporation.
+ */
+
+#define pr_fmt(fmt) "xive-kvm: " fmt
+
+#include <linux/kernel.h>
+#include <linux/kvm_host.h>
+#include <linux/err.h>
+#include <linux/gfp.h>
+#include <linux/spinlock.h>
+#include <linux/delay.h>
+#include <asm/uaccess.h>
+#include <asm/kvm_book3s.h>
+#include <asm/kvm_ppc.h>
+#include <asm/hvcall.h>
+#include <asm/xive.h>
+#include <asm/xive-regs.h>
+#include <asm/debug.h>
+#include <asm/debugfs.h>
+#include <asm/opal.h>
+
+#include <linux/debugfs.h>
+#include <linux/seq_file.h>
+
+#include "book3s_xive.h"
+
+static int kvmppc_xive_native_set_attr(struct kvm_device *dev,
+				       struct kvm_device_attr *attr)
+{
+	switch (attr->group) {
+	case KVM_DEV_XIVE_GRP_CTRL:
+		break;
+	}
+	return -ENXIO;
+}
+
+static int kvmppc_xive_native_get_attr(struct kvm_device *dev,
+				       struct kvm_device_attr *attr)
+{
+	return -ENXIO;
+}
+
+static int kvmppc_xive_native_has_attr(struct kvm_device *dev,
+				       struct kvm_device_attr *attr)
+{
+	switch (attr->group) {
+	case KVM_DEV_XIVE_GRP_CTRL:
+		break;
+	}
+	return -ENXIO;
+}
+
+static void kvmppc_xive_native_free(struct kvm_device *dev)
+{
+	struct kvmppc_xive *xive = dev->private;
+	struct kvm *kvm = xive->kvm;
+
+	debugfs_remove(xive->dentry);
+
+	pr_devel("Destroying xive native device\n");
+
+	if (kvm)
+		kvm->arch.xive = NULL;
+
+	if (xive->vp_base != XIVE_INVALID_VP)
+		xive_native_free_vp_block(xive->vp_base);
+
+	kfree(xive);
+	kfree(dev);
+}
+
+static int kvmppc_xive_native_create(struct kvm_device *dev, u32 type)
+{
+	struct kvmppc_xive *xive;
+	struct kvm *kvm = dev->kvm;
+	int ret = 0;
+
+	pr_devel("Creating xive native device\n");
+
+	if (kvm->arch.xive)
+		return -EEXIST;
+
+	xive = kzalloc(sizeof(*xive), GFP_KERNEL);
+	if (!xive)
+		return -ENOMEM;
+
+	dev->private = xive;
+	xive->dev = dev;
+	xive->kvm = kvm;
+	kvm->arch.xive = xive;
+
+	/*
+	 * Allocate a bunch of VPs. KVM_MAX_VCPUS is a large value for
+	 * a default. Getting the max number of CPUs the VM was
+	 * configured with would improve our usage of the XIVE VP space.
+	 */
+	xive->vp_base = xive_native_alloc_vp_block(KVM_MAX_VCPUS);
+	pr_devel("VP_Base=%x\n", xive->vp_base);
+
+	if (xive->vp_base == XIVE_INVALID_VP)
+		ret = -ENXIO;
+
+	xive->single_escalation = xive_native_has_single_escalation();
+
+	if (ret)
+		kfree(xive);
+
+	return ret;
+}
+
+static int xive_native_debug_show(struct seq_file *m, void *private)
+{
+	struct kvmppc_xive *xive = m->private;
+	struct kvm *kvm = xive->kvm;
+
+	if (!kvm)
+		return 0;
+
+	return 0;
+}
+
+static int xive_native_debug_open(struct inode *inode, struct file *file)
+{
+	return single_open(file, xive_native_debug_show, inode->i_private);
+}
+
+static const struct file_operations xive_native_debug_fops = {
+	.open = xive_native_debug_open,
+	.read = seq_read,
+	.llseek = seq_lseek,
+	.release = single_release,
+};
+
+static void xive_native_debugfs_init(struct kvmppc_xive *xive)
+{
+	char *name;
+
+	name = kasprintf(GFP_KERNEL, "kvm-xive-%p", xive);
+	if (!name) {
+		pr_err("%s: no memory for name\n", __func__);
+		return;
+	}
+
+	xive->dentry = debugfs_create_file(name, 0444, powerpc_debugfs_root,
+					   xive, &xive_native_debug_fops);
+
+	pr_debug("%s: created %s\n", __func__, name);
+	kfree(name);
+}
+
+static void kvmppc_xive_native_init(struct kvm_device *dev)
+{
+	struct kvmppc_xive *xive = (struct kvmppc_xive *)dev->private;
+
+	/* Register some debug interfaces */
+	xive_native_debugfs_init(xive);
+}
+
+struct kvm_device_ops kvm_xive_native_ops = {
+	.name = "kvm-xive-native",
+	.create = kvmppc_xive_native_create,
+	.init = kvmppc_xive_native_init,
+	.destroy = kvmppc_xive_native_free,
+	.set_attr = kvmppc_xive_native_set_attr,
+	.get_attr = kvmppc_xive_native_get_attr,
+	.has_attr = kvmppc_xive_native_has_attr,
+};
+
+void kvmppc_xive_native_init_module(void)
+{
+	;
+}
+
+void kvmppc_xive_native_exit_module(void)
+{
+	;
+}
diff --git a/Documentation/virtual/kvm/devices/xive.txt b/Documentation/virtual/kvm/devices/xive.txt
new file mode 100644
index 000000000000..fdbd2ff92a88
--- /dev/null
+++ b/Documentation/virtual/kvm/devices/xive.txt
@@ -0,0 +1,19 @@
+POWER9 eXternal Interrupt Virtualization Engine (XIVE Gen1)
+==========================================================
+
+Device types supported:
+  KVM_DEV_TYPE_XIVE     POWER9 XIVE Interrupt Controller generation 1
+
+This device acts as a VM interrupt controller. It provides the KVM
+interface to configure the interrupt sources of a VM in the underlying
+POWER9 XIVE interrupt controller.
+
+Only one XIVE instance may be instantiated. A guest XIVE device
+requires a POWER9 host and the guest OS should have support for the
+XIVE native exploitation interrupt mode. If not, it should run using
+the legacy interrupt mode, referred as XICS (POWER7/8).
+
+* Groups:
+
+  1. KVM_DEV_XIVE_GRP_CTRL
+  Provides global controls on the device
diff --git a/arch/powerpc/kvm/Makefile b/arch/powerpc/kvm/Makefile
index 3223aec88b2c..4c67cc79de7c 100644
--- a/arch/powerpc/kvm/Makefile
+++ b/arch/powerpc/kvm/Makefile
@@ -94,7 +94,7 @@ endif
 kvm-book3s_64-objs-$(CONFIG_KVM_XICS) += \
 	book3s_xics.o
 
-kvm-book3s_64-objs-$(CONFIG_KVM_XIVE) += book3s_xive.o
+kvm-book3s_64-objs-$(CONFIG_KVM_XIVE) += book3s_xive.o book3s_xive_native.o
 kvm-book3s_64-objs-$(CONFIG_SPAPR_TCE_IOMMU) += book3s_64_vio.o
 
 kvm-book3s_64-module-objs := \
-- 
2.20.1


^ permalink raw reply related

* [PATCH v5 16/16] KVM: PPC: Book3S HV: XIVE: introduce a 'release' device operation
From: Cédric Le Goater @ 2019-04-10 17:04 UTC (permalink / raw)
  To: kvm-ppc
  Cc: kvm, Paul Mackerras, Cédric Le Goater, Paolo Bonzini,
	linuxppc-dev, David Gibson
In-Reply-To: <20190410170448.3923-1-clg@kaod.org>

When a P9 sPAPR VM boots, the CAS negotiation process determines which
interrupt mode to use (XICS legacy or XIVE native) and invokes a
machine reset to activate the chosen mode.

To be able to switch from one mode to another, we introduce the
capability to release a KVM device without destroying the VM. The KVM
device interface is extended with a new 'release' operation which is
called when the file descriptor of the device is closed.

Such operations are defined for the XICS-on-XIVE and the XIVE native
KVM devices. They clear the vCPU interrupt presenters that could be
attached and then destroy the device.

This is not considered as a safe operation as the vCPUs are still
running and could be referencing the KVM device through their
presenters. To protect the system from any breakage, the kvmppc_xive
objects representing both KVM devices are now stored in an array under
the VM. Allocation is performed on first usage and memory is freed
only when the VM exits.

Cc: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
 arch/powerpc/include/asm/kvm_host.h   |  1 +
 arch/powerpc/kvm/book3s_xive.h        |  1 +
 include/linux/kvm_host.h              |  1 +
 arch/powerpc/kvm/book3s_xive.c        | 99 ++++++++++++++++++++++++++-
 arch/powerpc/kvm/book3s_xive_native.c | 45 +++++++++++-
 virt/kvm/kvm_main.c                   | 13 ++++
 6 files changed, 156 insertions(+), 4 deletions(-)

diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h
index 9cc6abdce1b9..ed059c95e56a 100644
--- a/arch/powerpc/include/asm/kvm_host.h
+++ b/arch/powerpc/include/asm/kvm_host.h
@@ -314,6 +314,7 @@ struct kvm_arch {
 #ifdef CONFIG_KVM_XICS
 	struct kvmppc_xics *xics;
 	struct kvmppc_xive *xive;
+	struct kvmppc_xive *xive_devices[2];
 	struct kvmppc_passthru_irqmap *pimap;
 #endif
 	struct kvmppc_ops *kvm_ops;
diff --git a/arch/powerpc/kvm/book3s_xive.h b/arch/powerpc/kvm/book3s_xive.h
index e011622dc038..426146332984 100644
--- a/arch/powerpc/kvm/book3s_xive.h
+++ b/arch/powerpc/kvm/book3s_xive.h
@@ -283,6 +283,7 @@ void kvmppc_xive_free_sources(struct kvmppc_xive_src_block *sb);
 int kvmppc_xive_select_target(struct kvm *kvm, u32 *server, u8 prio);
 int kvmppc_xive_attach_escalation(struct kvm_vcpu *vcpu, u8 prio,
 				  bool single_escalation);
+struct kvmppc_xive *kvmppc_xive_get_device(struct kvm *kvm, u32 type);
 
 #endif /* CONFIG_KVM_XICS */
 #endif /* _KVM_PPC_BOOK3S_XICS_H */
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 831d963451d8..3b444620d8fc 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -1246,6 +1246,7 @@ struct kvm_device_ops {
 	long (*ioctl)(struct kvm_device *dev, unsigned int ioctl,
 		      unsigned long arg);
 	int (*mmap)(struct kvm_device *dev, struct vm_area_struct *vma);
+	void (*release)(struct kvm_device *dev);
 };
 
 void kvm_device_get(struct kvm_device *dev);
diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c
index 480a3fc6b9fd..064a9f2ae678 100644
--- a/arch/powerpc/kvm/book3s_xive.c
+++ b/arch/powerpc/kvm/book3s_xive.c
@@ -1100,11 +1100,19 @@ void kvmppc_xive_disable_vcpu_interrupts(struct kvm_vcpu *vcpu)
 void kvmppc_xive_cleanup_vcpu(struct kvm_vcpu *vcpu)
 {
 	struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
-	struct kvmppc_xive *xive = xc->xive;
+	struct kvmppc_xive *xive;
 	int i;
 
+	if (!kvmppc_xics_enabled(vcpu))
+		return;
+
+	if (!xc)
+		return;
+
 	pr_devel("cleanup_vcpu(cpu=%d)\n", xc->server_num);
 
+	xive = xc->xive;
+
 	/* Ensure no interrupt is still routed to that VP */
 	xc->valid = false;
 	kvmppc_xive_disable_vcpu_interrupts(vcpu);
@@ -1141,6 +1149,10 @@ void kvmppc_xive_cleanup_vcpu(struct kvm_vcpu *vcpu)
 	}
 	/* Free the VP */
 	kfree(xc);
+
+	/* Cleanup the vcpu */
+	vcpu->arch.irq_type = KVMPPC_IRQ_DEFAULT;
+	vcpu->arch.xive_vcpu = NULL;
 }
 
 int kvmppc_xive_connect_vcpu(struct kvm_device *dev,
@@ -1158,7 +1170,7 @@ int kvmppc_xive_connect_vcpu(struct kvm_device *dev,
 	}
 	if (xive->kvm != vcpu->kvm)
 		return -EPERM;
-	if (vcpu->arch.irq_type)
+	if (vcpu->arch.irq_type != KVMPPC_IRQ_DEFAULT)
 		return -EBUSY;
 	if (kvmppc_xive_find_server(vcpu->kvm, cpu)) {
 		pr_devel("Duplicate !\n");
@@ -1824,6 +1836,9 @@ void kvmppc_xive_free_sources(struct kvmppc_xive_src_block *sb)
 	}
 }
 
+/*
+ * Called when VM is destroyed
+ */
 static void kvmppc_xive_free(struct kvm_device *dev)
 {
 	struct kvmppc_xive *xive = dev->private;
@@ -1851,6 +1866,83 @@ static void kvmppc_xive_free(struct kvm_device *dev)
 	kfree(dev);
 }
 
+/*
+ * Called when device fd is closed
+ */
+static void kvmppc_xive_release(struct kvm_device *dev)
+{
+	struct kvmppc_xive *xive = dev->private;
+	struct kvm *kvm = xive->kvm;
+	struct kvm_vcpu *vcpu;
+	int i;
+
+	pr_devel("Releasing xive device\n");
+
+	/*
+	 * When releasing the KVM device fd, the vCPUs can still be
+	 * running and we should clean up the vCPU interrupt
+	 * presenters first.
+	 */
+	if (atomic_read(&kvm->online_vcpus) != 0) {
+		/*
+		 * call kick_all_cpus_sync() to ensure that all CPUs
+		 * have executed any pending interrupts
+		 */
+		if (is_kvmppc_hv_enabled(kvm))
+			kick_all_cpus_sync();
+
+		/*
+		 * TODO: There is still a race window with the early
+		 * checks in kvmppc_native_connect_vcpu()
+		 */
+		kvm_for_each_vcpu(i, vcpu, kvm)
+			kvmppc_xive_cleanup_vcpu(vcpu);
+	}
+
+	if (kvm)
+		kvm->arch.xive = NULL;
+
+	/* Mask and free interrupts */
+	for (i = 0; i <= xive->max_sbid; i++) {
+		if (xive->src_blocks[i])
+			kvmppc_xive_free_sources(xive->src_blocks[i]);
+		kfree(xive->src_blocks[i]);
+		xive->src_blocks[i] = NULL;
+	}
+
+	if (xive->vp_base != XIVE_INVALID_VP)
+		xive_native_free_vp_block(xive->vp_base);
+
+	/* Do no free device private data. Destroy handler will */
+	kfree(dev);
+}
+
+/*
+ * When the guest chooses the interrupt mode (XICS legacy or XIVE
+ * native), the VM will switch of KVM device. The previous device will
+ * be "released" before the new one is created.
+ *
+ * Until we are sure all execution paths are well protected, provide a
+ * fail safe (transitional) method for device destruction, in which
+ * the XIVE device pointer is recycled and not directly freed.
+ */
+struct kvmppc_xive *kvmppc_xive_get_device(struct kvm *kvm, u32 type)
+{
+	struct kvmppc_xive *xive;
+	bool xive_native_index = type == KVM_DEV_TYPE_XIVE;
+
+	xive = kvm->arch.xive_devices[xive_native_index];
+
+	if (!xive) {
+		xive = kzalloc(sizeof(*xive), GFP_KERNEL);
+		kvm->arch.xive_devices[xive_native_index] = xive;
+	} else {
+		memset(xive, 0, sizeof(*xive));
+	}
+
+	return xive;
+}
+
 static int kvmppc_xive_create(struct kvm_device *dev, u32 type)
 {
 	struct kvmppc_xive *xive;
@@ -1859,7 +1951,7 @@ static int kvmppc_xive_create(struct kvm_device *dev, u32 type)
 
 	pr_devel("Creating xive for partition\n");
 
-	xive = kzalloc(sizeof(*xive), GFP_KERNEL);
+	xive = kvmppc_xive_get_device(kvm, type);
 	if (!xive)
 		return -ENOMEM;
 
@@ -2024,6 +2116,7 @@ struct kvm_device_ops kvm_xive_ops = {
 	.name = "kvm-xive",
 	.create = kvmppc_xive_create,
 	.init = kvmppc_xive_init,
+	.release = kvmppc_xive_release,
 	.destroy = kvmppc_xive_free,
 	.set_attr = xive_set_attr,
 	.get_attr = xive_get_attr,
diff --git a/arch/powerpc/kvm/book3s_xive_native.c b/arch/powerpc/kvm/book3s_xive_native.c
index 62648f833adf..ba1c55a93673 100644
--- a/arch/powerpc/kvm/book3s_xive_native.c
+++ b/arch/powerpc/kvm/book3s_xive_native.c
@@ -964,6 +964,9 @@ static int kvmppc_xive_native_has_attr(struct kvm_device *dev,
 	return -ENXIO;
 }
 
+/*
+ * Called when VM is destroyed
+ */
 static void kvmppc_xive_native_free(struct kvm_device *dev)
 {
 	struct kvmppc_xive *xive = dev->private;
@@ -991,6 +994,45 @@ static void kvmppc_xive_native_free(struct kvm_device *dev)
 	kfree(dev);
 }
 
+/*
+ * Called when device fd is closed
+ */
+static void kvmppc_xive_native_release(struct kvm_device *dev)
+{
+	struct kvmppc_xive *xive = dev->private;
+	struct kvm *kvm = xive->kvm;
+	struct kvm_vcpu *vcpu;
+	int i;
+
+	pr_devel("Releasing xive native device\n");
+
+	/*
+	 * When releasing the KVM device fd, the vCPUs can still be
+	 * running and we should clean up the vCPU interrupt
+	 * presenters first.
+	 */
+	if (atomic_read(&kvm->online_vcpus) != 0) {
+		kvm_for_each_vcpu(i, vcpu, kvm)
+			kvmppc_xive_native_cleanup_vcpu(vcpu);
+	}
+
+	if (kvm)
+		kvm->arch.xive = NULL;
+
+	for (i = 0; i <= xive->max_sbid; i++) {
+		if (xive->src_blocks[i])
+			kvmppc_xive_free_sources(xive->src_blocks[i]);
+		kfree(xive->src_blocks[i]);
+		xive->src_blocks[i] = NULL;
+	}
+
+	if (xive->vp_base != XIVE_INVALID_VP)
+		xive_native_free_vp_block(xive->vp_base);
+
+	/* Do no free device private data. Destroy handler will */
+	kfree(dev);
+}
+
 static int kvmppc_xive_native_create(struct kvm_device *dev, u32 type)
 {
 	struct kvmppc_xive *xive;
@@ -1002,7 +1044,7 @@ static int kvmppc_xive_native_create(struct kvm_device *dev, u32 type)
 	if (kvm->arch.xive)
 		return -EEXIST;
 
-	xive = kzalloc(sizeof(*xive), GFP_KERNEL);
+	xive = kvmppc_xive_get_device(kvm, type);
 	if (!xive)
 		return -ENOMEM;
 
@@ -1182,6 +1224,7 @@ struct kvm_device_ops kvm_xive_native_ops = {
 	.name = "kvm-xive-native",
 	.create = kvmppc_xive_native_create,
 	.init = kvmppc_xive_native_init,
+	.release = kvmppc_xive_native_release,
 	.destroy = kvmppc_xive_native_free,
 	.set_attr = kvmppc_xive_native_set_attr,
 	.get_attr = kvmppc_xive_native_get_attr,
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index ea2018ae1cd7..ea2619d5ca98 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -2938,6 +2938,19 @@ static int kvm_device_release(struct inode *inode, struct file *filp)
 	struct kvm_device *dev = filp->private_data;
 	struct kvm *kvm = dev->kvm;
 
+	if (!dev)
+		return -ENODEV;
+
+	if (dev->kvm != kvm)
+		return -EPERM;
+
+	if (dev->ops->release) {
+		mutex_lock(&kvm->lock);
+		list_del(&dev->vm_node);
+		dev->ops->release(dev);
+		mutex_unlock(&kvm->lock);
+	}
+
 	kvm_put_kvm(kvm);
 	return 0;
 }
-- 
2.20.1


^ permalink raw reply related

* [PATCH v5 14/16] KVM: PPC: Book3S HV: XIVE: add passthrough support
From: Cédric Le Goater @ 2019-04-10 17:04 UTC (permalink / raw)
  To: kvm-ppc
  Cc: kvm, Paul Mackerras, Cédric Le Goater, linuxppc-dev,
	David Gibson
In-Reply-To: <20190410170448.3923-1-clg@kaod.org>

The KVM XICS-over-XIVE device and the proposed KVM XIVE native device
implement an IRQ space for the guest using the generic IPI interrupts
of the XIVE IC controller. These interrupts are allocated at the OPAL
level and "mapped" into the guest IRQ number space in the range 0-0x1FFF.
Interrupt management is performed in the XIVE way: using loads and
stores on the addresses of the XIVE IPI interrupt ESB pages.

Both KVM devices share the same internal structure caching information
on the interrupts, among which the xive_irq_data struct containing the
addresses of the IPI ESB pages and an extra one in case of pass-through.
The later contains the addresses of the ESB pages of the underlying HW
controller interrupts, PHB4 in all cases for now.

A guest, when running in the XICS legacy interrupt mode, lets the KVM
XICS-over-XIVE device "handle" interrupt management, that is to
perform the loads and stores on the addresses of the ESB pages of the
guest interrupts. However, when running in XIVE native exploitation
mode, the KVM XIVE native device exposes the interrupt ESB pages to
the guest and lets the guest perform directly the loads and stores.

The VMA exposing the ESB pages make use of a custom VM fault handler
which role is to populate the VMA with appropriate pages. When a fault
occurs, the guest IRQ number is deduced from the offset, and the ESB
pages of associated XIVE IPI interrupt are inserted in the VMA (using
the internal structure caching information on the interrupts).

Supporting device passthrough in the guest running in XIVE native
exploitation mode adds some extra refinements because the ESB pages
of a different HW controller (PHB4) need to be exposed to the guest
along with the initial IPI ESB pages of the XIVE IC controller. But
the overall mechanic is the same.

When the device HW irqs are mapped into or unmapped from the guest
IRQ number space, the passthru_irq helpers, kvmppc_xive_set_mapped()
and kvmppc_xive_clr_mapped(), are called to record or clear the
passthrough interrupt information and to perform the switch.

The approach taken by this patch is to clear the ESB pages of the
guest IRQ number being mapped and let the VM fault handler repopulate.
The handler will insert the ESB page corresponding to the HW interrupt
of the device being passed-through or the initial IPI ESB page if the
device is being removed.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
---
 arch/powerpc/kvm/book3s_xive.h             |  9 +++++
 arch/powerpc/kvm/book3s_xive.c             | 15 ++++++++
 arch/powerpc/kvm/book3s_xive_native.c      | 41 ++++++++++++++++++++++
 Documentation/virtual/kvm/devices/xive.txt | 19 ++++++++++
 4 files changed, 84 insertions(+)

diff --git a/arch/powerpc/kvm/book3s_xive.h b/arch/powerpc/kvm/book3s_xive.h
index 622f594d93e1..e011622dc038 100644
--- a/arch/powerpc/kvm/book3s_xive.h
+++ b/arch/powerpc/kvm/book3s_xive.h
@@ -94,6 +94,11 @@ struct kvmppc_xive_src_block {
 	struct kvmppc_xive_irq_state irq_state[KVMPPC_XICS_IRQ_PER_ICS];
 };
 
+struct kvmppc_xive;
+
+struct kvmppc_xive_ops {
+	int (*reset_mapped)(struct kvm *kvm, unsigned long guest_irq);
+};
 
 struct kvmppc_xive {
 	struct kvm *kvm;
@@ -132,6 +137,10 @@ struct kvmppc_xive {
 
 	/* Flags */
 	u8	single_escalation;
+
+	struct kvmppc_xive_ops *ops;
+	struct address_space   *mapping;
+	struct mutex mapping_lock;
 };
 
 #define KVMPPC_XIVE_Q_COUNT	8
diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c
index c1b7aa7dbc28..480a3fc6b9fd 100644
--- a/arch/powerpc/kvm/book3s_xive.c
+++ b/arch/powerpc/kvm/book3s_xive.c
@@ -937,6 +937,13 @@ int kvmppc_xive_set_mapped(struct kvm *kvm, unsigned long guest_irq,
 	/* Turn the IPI hard off */
 	xive_vm_esb_load(&state->ipi_data, XIVE_ESB_SET_PQ_01);
 
+	/*
+	 * Reset ESB guest mapping. Needed when ESB pages are exposed
+	 * to the guest in XIVE native mode
+	 */
+	if (xive->ops && xive->ops->reset_mapped)
+		xive->ops->reset_mapped(kvm, guest_irq);
+
 	/* Grab info about irq */
 	state->pt_number = hw_irq;
 	state->pt_data = irq_data_get_irq_handler_data(host_data);
@@ -1022,6 +1029,14 @@ int kvmppc_xive_clr_mapped(struct kvm *kvm, unsigned long guest_irq,
 	state->pt_number = 0;
 	state->pt_data = NULL;
 
+	/*
+	 * Reset ESB guest mapping. Needed when ESB pages are exposed
+	 * to the guest in XIVE native mode
+	 */
+	if (xive->ops && xive->ops->reset_mapped) {
+		xive->ops->reset_mapped(kvm, guest_irq);
+	}
+
 	/* Reconfigure the IPI */
 	xive_native_configure_irq(state->ipi_number,
 				  kvmppc_xive_vp(xive, state->act_server),
diff --git a/arch/powerpc/kvm/book3s_xive_native.c b/arch/powerpc/kvm/book3s_xive_native.c
index 465eb90ff23e..62648f833adf 100644
--- a/arch/powerpc/kvm/book3s_xive_native.c
+++ b/arch/powerpc/kvm/book3s_xive_native.c
@@ -11,6 +11,7 @@
 #include <linux/gfp.h>
 #include <linux/spinlock.h>
 #include <linux/delay.h>
+#include <linux/file.h>
 #include <asm/uaccess.h>
 #include <asm/kvm_book3s.h>
 #include <asm/kvm_ppc.h>
@@ -165,6 +166,35 @@ int kvmppc_xive_native_connect_vcpu(struct kvm_device *dev,
 	return rc;
 }
 
+/*
+ * Device passthrough support
+ */
+static int kvmppc_xive_native_reset_mapped(struct kvm *kvm, unsigned long irq)
+{
+	struct kvmppc_xive *xive = kvm->arch.xive;
+
+	if (irq >= KVMPPC_XIVE_NR_IRQS)
+		return -EINVAL;
+
+	/*
+	 * Clear the ESB pages of the IRQ number being mapped (or
+	 * unmapped) into the guest and let the the VM fault handler
+	 * repopulate with the appropriate ESB pages (device or IC)
+	 */
+	pr_debug("clearing esb pages for girq 0x%lx\n", irq);
+	mutex_lock(&xive->mapping_lock);
+	if (xive->mapping)
+		unmap_mapping_range(xive->mapping,
+				    irq * (2ull << PAGE_SHIFT),
+				    2ull << PAGE_SHIFT, 1);
+	mutex_unlock(&xive->mapping_lock);
+	return 0;
+}
+
+static struct kvmppc_xive_ops kvmppc_xive_native_ops =  {
+	.reset_mapped = kvmppc_xive_native_reset_mapped,
+};
+
 static vm_fault_t xive_native_esb_fault(struct vm_fault *vmf)
 {
 	struct vm_area_struct *vma = vmf->vma;
@@ -242,6 +272,8 @@ static const struct vm_operations_struct xive_native_tima_vmops = {
 static int kvmppc_xive_native_mmap(struct kvm_device *dev,
 				   struct vm_area_struct *vma)
 {
+	struct kvmppc_xive *xive = dev->private;
+
 	/* We only allow mappings at fixed offset for now */
 	if (vma->vm_pgoff == KVM_XIVE_TIMA_PAGE_OFFSET) {
 		if (vma_pages(vma) > 4)
@@ -257,6 +289,13 @@ static int kvmppc_xive_native_mmap(struct kvm_device *dev,
 
 	vma->vm_flags |= VM_IO | VM_PFNMAP;
 	vma->vm_page_prot = pgprot_noncached_wc(vma->vm_page_prot);
+
+	/*
+	 * Grab the KVM device file address_space to be able to clear
+	 * the ESB pages mapping when a device is passed-through into
+	 * the guest.
+	 */
+	xive->mapping = vma->vm_file->f_mapping;
 	return 0;
 }
 
@@ -971,6 +1010,7 @@ static int kvmppc_xive_native_create(struct kvm_device *dev, u32 type)
 	xive->dev = dev;
 	xive->kvm = kvm;
 	kvm->arch.xive = xive;
+	mutex_init(&xive->mapping_lock);
 
 	/*
 	 * Allocate a bunch of VPs. KVM_MAX_VCPUS is a large value for
@@ -984,6 +1024,7 @@ static int kvmppc_xive_native_create(struct kvm_device *dev, u32 type)
 		ret = -ENXIO;
 
 	xive->single_escalation = xive_native_has_single_escalation();
+	xive->ops = &kvmppc_xive_native_ops;
 
 	if (ret)
 		kfree(xive);
diff --git a/Documentation/virtual/kvm/devices/xive.txt b/Documentation/virtual/kvm/devices/xive.txt
index 69ee62d3d4dc..9a24a4525253 100644
--- a/Documentation/virtual/kvm/devices/xive.txt
+++ b/Documentation/virtual/kvm/devices/xive.txt
@@ -43,6 +43,25 @@ the legacy interrupt mode, referred as XICS (POWER7/8).
   manage the source: to trigger, to EOI, to turn off the source for
   instance.
 
+  3. Device pass-through
+
+  When a device is passed-through into the guest, the source
+  interrupts are from a different HW controller (PHB4) and the ESB
+  pages exposed to the guest should accommadate this change.
+
+  The passthru_irq helpers, kvmppc_xive_set_mapped() and
+  kvmppc_xive_clr_mapped() are called when the device HW irqs are
+  mapped into or unmapped from the guest IRQ number space. The KVM
+  device extends these helpers to clear the ESB pages of the guest IRQ
+  number being mapped and then lets the VM fault handler repopulate.
+  The handler will insert the ESB page corresponding to the HW
+  interrupt of the device being passed-through or the initial IPI ESB
+  page if the device has being removed.
+
+  The ESB remapping is fully transparent to the guest and the OS
+  device driver. All handling is done within VFIO and the above
+  helpers in KVM-PPC.
+
 * Groups:
 
   1. KVM_DEV_XIVE_GRP_CTRL
-- 
2.20.1


^ permalink raw reply related

* [PATCH v5 13/16] KVM: PPC: Book3S HV: XIVE: add a mapping for the source ESB pages
From: Cédric Le Goater @ 2019-04-10 17:04 UTC (permalink / raw)
  To: kvm-ppc
  Cc: kvm, Paul Mackerras, Cédric Le Goater, linuxppc-dev,
	David Gibson
In-Reply-To: <20190410170448.3923-1-clg@kaod.org>

Each source is associated with an Event State Buffer (ESB) with a
even/odd pair of pages which provides commands to manage the source:
to trigger, to EOI, to turn off the source for instance.

The custom VM fault handler will deduce the guest IRQ number from the
offset of the fault, and the ESB page of the associated XIVE interrupt
will be inserted into the VMA using the internal structure caching
information on the interrupts.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
---
 arch/powerpc/include/uapi/asm/kvm.h        |  1 +
 arch/powerpc/kvm/book3s_xive_native.c      | 57 ++++++++++++++++++++++
 Documentation/virtual/kvm/devices/xive.txt |  7 +++
 3 files changed, 65 insertions(+)

diff --git a/arch/powerpc/include/uapi/asm/kvm.h b/arch/powerpc/include/uapi/asm/kvm.h
index 0998e8edc91a..b0f72dea8b11 100644
--- a/arch/powerpc/include/uapi/asm/kvm.h
+++ b/arch/powerpc/include/uapi/asm/kvm.h
@@ -721,5 +721,6 @@ struct kvm_ppc_xive_eq {
 #define KVM_XIVE_EQ_ALWAYS_NOTIFY	0x00000001
 
 #define KVM_XIVE_TIMA_PAGE_OFFSET	0
+#define KVM_XIVE_ESB_PAGE_OFFSET	4
 
 #endif /* __LINUX_KVM_POWERPC_H */
diff --git a/arch/powerpc/kvm/book3s_xive_native.c b/arch/powerpc/kvm/book3s_xive_native.c
index f5314da0cb45..465eb90ff23e 100644
--- a/arch/powerpc/kvm/book3s_xive_native.c
+++ b/arch/powerpc/kvm/book3s_xive_native.c
@@ -165,6 +165,59 @@ int kvmppc_xive_native_connect_vcpu(struct kvm_device *dev,
 	return rc;
 }
 
+static vm_fault_t xive_native_esb_fault(struct vm_fault *vmf)
+{
+	struct vm_area_struct *vma = vmf->vma;
+	struct kvm_device *dev = vma->vm_file->private_data;
+	struct kvmppc_xive *xive = dev->private;
+	struct kvmppc_xive_src_block *sb;
+	struct kvmppc_xive_irq_state *state;
+	struct xive_irq_data *xd;
+	u32 hw_num;
+	u16 src;
+	u64 page;
+	unsigned long irq;
+	u64 page_offset;
+
+	/*
+	 * Linux/KVM uses a two pages ESB setting, one for trigger and
+	 * one for EOI
+	 */
+	page_offset = vmf->pgoff - vma->vm_pgoff;
+	irq = page_offset / 2;
+
+	sb = kvmppc_xive_find_source(xive, irq, &src);
+	if (!sb) {
+		pr_devel("%s: source %lx not found !\n", __func__, irq);
+		return VM_FAULT_SIGBUS;
+	}
+
+	state = &sb->irq_state[src];
+	kvmppc_xive_select_irq(state, &hw_num, &xd);
+
+	arch_spin_lock(&sb->lock);
+
+	/*
+	 * first/even page is for trigger
+	 * second/odd page is for EOI and management.
+	 */
+	page = page_offset % 2 ? xd->eoi_page : xd->trig_page;
+	arch_spin_unlock(&sb->lock);
+
+	if (WARN_ON(!page)) {
+		pr_err("%s: acessing invalid ESB page for source %lx !\n",
+		       __func__, irq);
+		return VM_FAULT_SIGBUS;
+	}
+
+	vmf_insert_pfn(vma, vmf->address, page >> PAGE_SHIFT);
+	return VM_FAULT_NOPAGE;
+}
+
+static const struct vm_operations_struct xive_native_esb_vmops = {
+	.fault = xive_native_esb_fault,
+};
+
 static vm_fault_t xive_native_tima_fault(struct vm_fault *vmf)
 {
 	struct vm_area_struct *vma = vmf->vma;
@@ -194,6 +247,10 @@ static int kvmppc_xive_native_mmap(struct kvm_device *dev,
 		if (vma_pages(vma) > 4)
 			return -EINVAL;
 		vma->vm_ops = &xive_native_tima_vmops;
+	} else if (vma->vm_pgoff == KVM_XIVE_ESB_PAGE_OFFSET) {
+		if (vma_pages(vma) > KVMPPC_XIVE_NR_IRQS * 2)
+			return -EINVAL;
+		vma->vm_ops = &xive_native_esb_vmops;
 	} else {
 		return -EINVAL;
 	}
diff --git a/Documentation/virtual/kvm/devices/xive.txt b/Documentation/virtual/kvm/devices/xive.txt
index 0cd7847ec38a..69ee62d3d4dc 100644
--- a/Documentation/virtual/kvm/devices/xive.txt
+++ b/Documentation/virtual/kvm/devices/xive.txt
@@ -36,6 +36,13 @@ the legacy interrupt mode, referred as XICS (POWER7/8).
   third (operating system) and the fourth (user level) are exposed the
   guest.
 
+  2. Event State Buffer (ESB)
+
+  Each source is associated with an Event State Buffer (ESB) with
+  either a pair of even/odd pair of pages which provides commands to
+  manage the source: to trigger, to EOI, to turn off the source for
+  instance.
+
 * Groups:
 
   1. KVM_DEV_XIVE_GRP_CTRL
-- 
2.20.1


^ permalink raw reply related

* [PATCH v5 11/16] KVM: introduce a 'mmap' method for KVM devices
From: Cédric Le Goater @ 2019-04-10 17:04 UTC (permalink / raw)
  To: kvm-ppc
  Cc: kvm, Paul Mackerras, Cédric Le Goater, Paolo Bonzini,
	linuxppc-dev, David Gibson
In-Reply-To: <20190410170448.3923-1-clg@kaod.org>

Some KVM devices will want to handle special mappings related to the
underlying HW. For instance, the XIVE interrupt controller of the
POWER9 processor has MMIO pages for thread interrupt management and
for interrupt source control that need to be exposed to the guest when
the OS has the required support.

Cc: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
---
 include/linux/kvm_host.h |  1 +
 virt/kvm/kvm_main.c      | 11 +++++++++++
 2 files changed, 12 insertions(+)

diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 9d55c63db09b..831d963451d8 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -1245,6 +1245,7 @@ struct kvm_device_ops {
 	int (*has_attr)(struct kvm_device *dev, struct kvm_device_attr *attr);
 	long (*ioctl)(struct kvm_device *dev, unsigned int ioctl,
 		      unsigned long arg);
+	int (*mmap)(struct kvm_device *dev, struct vm_area_struct *vma);
 };
 
 void kvm_device_get(struct kvm_device *dev);
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 55fe8e20d8fd..ea2018ae1cd7 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -2884,6 +2884,16 @@ static long kvm_vcpu_compat_ioctl(struct file *filp,
 }
 #endif
 
+static int kvm_device_mmap(struct file *filp, struct vm_area_struct *vma)
+{
+	struct kvm_device *dev = filp->private_data;
+
+	if (dev->ops->mmap)
+		return dev->ops->mmap(dev, vma);
+
+	return -ENODEV;
+}
+
 static int kvm_device_ioctl_attr(struct kvm_device *dev,
 				 int (*accessor)(struct kvm_device *dev,
 						 struct kvm_device_attr *attr),
@@ -2936,6 +2946,7 @@ static const struct file_operations kvm_device_fops = {
 	.unlocked_ioctl = kvm_device_ioctl,
 	.release = kvm_device_release,
 	KVM_COMPAT(kvm_device_ioctl),
+	.mmap = kvm_device_mmap,
 };
 
 struct kvm_device *kvm_device_from_filp(struct file *filp)
-- 
2.20.1


^ permalink raw reply related

* [PATCH v5 10/16] KVM: PPC: Book3S HV: XIVE: add get/set accessors for the VP XIVE state
From: Cédric Le Goater @ 2019-04-10 17:04 UTC (permalink / raw)
  To: kvm-ppc
  Cc: kvm, Paul Mackerras, Cédric Le Goater, linuxppc-dev,
	David Gibson
In-Reply-To: <20190410170448.3923-1-clg@kaod.org>

The state of the thread interrupt management registers needs to be
collected for migration. These registers are cached under the
'xive_saved_state.w01' field of the VCPU when the VPCU context is
pulled from the HW thread. An OPAL call retrieves the backup of the
IPB register in the underlying XIVE NVT structure and merges it in the
KVM state.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
---

 Changes since v4:

 - add documentation in Documentation/virtual/kvm/api.txt

 arch/powerpc/include/asm/kvm_ppc.h         | 11 ++++
 arch/powerpc/include/uapi/asm/kvm.h        |  2 +
 arch/powerpc/kvm/book3s.c                  | 24 +++++++
 arch/powerpc/kvm/book3s_xive_native.c      | 76 ++++++++++++++++++++++
 Documentation/virtual/kvm/api.txt          |  1 +
 Documentation/virtual/kvm/devices/xive.txt | 17 +++++
 6 files changed, 131 insertions(+)

diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h
index 6928a35ac3c7..0579c9b253db 100644
--- a/arch/powerpc/include/asm/kvm_ppc.h
+++ b/arch/powerpc/include/asm/kvm_ppc.h
@@ -273,6 +273,7 @@ union kvmppc_one_reg {
 		u64	addr;
 		u64	length;
 	}	vpaval;
+	u64	xive_timaval[2];
 };
 
 struct kvmppc_ops {
@@ -605,6 +606,10 @@ extern int kvmppc_xive_native_connect_vcpu(struct kvm_device *dev,
 extern void kvmppc_xive_native_cleanup_vcpu(struct kvm_vcpu *vcpu);
 extern void kvmppc_xive_native_init_module(void);
 extern void kvmppc_xive_native_exit_module(void);
+extern int kvmppc_xive_native_get_vp(struct kvm_vcpu *vcpu,
+				     union kvmppc_one_reg *val);
+extern int kvmppc_xive_native_set_vp(struct kvm_vcpu *vcpu,
+				     union kvmppc_one_reg *val);
 
 #else
 static inline int kvmppc_xive_set_xive(struct kvm *kvm, u32 irq, u32 server,
@@ -637,6 +642,12 @@ static inline int kvmppc_xive_native_connect_vcpu(struct kvm_device *dev,
 static inline void kvmppc_xive_native_cleanup_vcpu(struct kvm_vcpu *vcpu) { }
 static inline void kvmppc_xive_native_init_module(void) { }
 static inline void kvmppc_xive_native_exit_module(void) { }
+static inline int kvmppc_xive_native_get_vp(struct kvm_vcpu *vcpu,
+					    union kvmppc_one_reg *val)
+{ return 0; }
+static inline int kvmppc_xive_native_set_vp(struct kvm_vcpu *vcpu,
+					    union kvmppc_one_reg *val)
+{ return -ENOENT; }
 
 #endif /* CONFIG_KVM_XIVE */
 
diff --git a/arch/powerpc/include/uapi/asm/kvm.h b/arch/powerpc/include/uapi/asm/kvm.h
index 12744608a61c..cd3f16b70a2e 100644
--- a/arch/powerpc/include/uapi/asm/kvm.h
+++ b/arch/powerpc/include/uapi/asm/kvm.h
@@ -482,6 +482,8 @@ struct kvm_ppc_cpu_char {
 #define  KVM_REG_PPC_ICP_PPRI_SHIFT	16	/* pending irq priority */
 #define  KVM_REG_PPC_ICP_PPRI_MASK	0xff
 
+#define KVM_REG_PPC_VP_STATE	(KVM_REG_PPC | KVM_REG_SIZE_U128 | 0x8d)
+
 /* Device control API: PPC-specific devices */
 #define KVM_DEV_MPIC_GRP_MISC		1
 #define   KVM_DEV_MPIC_BASE_ADDR	0	/* 64-bit */
diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c
index 7c3348fa27e1..efd15101eef0 100644
--- a/arch/powerpc/kvm/book3s.c
+++ b/arch/powerpc/kvm/book3s.c
@@ -651,6 +651,18 @@ int kvmppc_get_one_reg(struct kvm_vcpu *vcpu, u64 id,
 				*val = get_reg_val(id, kvmppc_xics_get_icp(vcpu));
 			break;
 #endif /* CONFIG_KVM_XICS */
+#ifdef CONFIG_KVM_XIVE
+		case KVM_REG_PPC_VP_STATE:
+			if (!vcpu->arch.xive_vcpu) {
+				r = -ENXIO;
+				break;
+			}
+			if (xive_enabled())
+				r = kvmppc_xive_native_get_vp(vcpu, val);
+			else
+				r = -ENXIO;
+			break;
+#endif /* CONFIG_KVM_XIVE */
 		case KVM_REG_PPC_FSCR:
 			*val = get_reg_val(id, vcpu->arch.fscr);
 			break;
@@ -724,6 +736,18 @@ int kvmppc_set_one_reg(struct kvm_vcpu *vcpu, u64 id,
 				r = kvmppc_xics_set_icp(vcpu, set_reg_val(id, *val));
 			break;
 #endif /* CONFIG_KVM_XICS */
+#ifdef CONFIG_KVM_XIVE
+		case KVM_REG_PPC_VP_STATE:
+			if (!vcpu->arch.xive_vcpu) {
+				r = -ENXIO;
+				break;
+			}
+			if (xive_enabled())
+				r = kvmppc_xive_native_set_vp(vcpu, val);
+			else
+				r = -ENXIO;
+			break;
+#endif /* CONFIG_KVM_XIVE */
 		case KVM_REG_PPC_FSCR:
 			vcpu->arch.fscr = set_reg_val(id, *val);
 			break;
diff --git a/arch/powerpc/kvm/book3s_xive_native.c b/arch/powerpc/kvm/book3s_xive_native.c
index 16d23ef3bd39..2f9d5e9439a6 100644
--- a/arch/powerpc/kvm/book3s_xive_native.c
+++ b/arch/powerpc/kvm/book3s_xive_native.c
@@ -896,6 +896,82 @@ static int kvmppc_xive_native_create(struct kvm_device *dev, u32 type)
 	return ret;
 }
 
+/*
+ * Interrupt Pending Buffer (IPB) offset
+ */
+#define TM_IPB_SHIFT 40
+#define TM_IPB_MASK  (((u64) 0xFF) << TM_IPB_SHIFT)
+
+int kvmppc_xive_native_get_vp(struct kvm_vcpu *vcpu, union kvmppc_one_reg *val)
+{
+	struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
+	u64 opal_state;
+	int rc;
+
+	if (!kvmppc_xive_enabled(vcpu))
+		return -EPERM;
+
+	if (!xc)
+		return -ENOENT;
+
+	/* Thread context registers. We only care about IPB and CPPR */
+	val->xive_timaval[0] = vcpu->arch.xive_saved_state.w01;
+
+	/* Get the VP state from OPAL */
+	rc = xive_native_get_vp_state(xc->vp_id, &opal_state);
+	if (rc)
+		return rc;
+
+	/*
+	 * Capture the backup of IPB register in the NVT structure and
+	 * merge it in our KVM VP state.
+	 */
+	val->xive_timaval[0] |= cpu_to_be64(opal_state & TM_IPB_MASK);
+
+	pr_devel("%s NSR=%02x CPPR=%02x IBP=%02x PIPR=%02x w01=%016llx w2=%08x opal=%016llx\n",
+		 __func__,
+		 vcpu->arch.xive_saved_state.nsr,
+		 vcpu->arch.xive_saved_state.cppr,
+		 vcpu->arch.xive_saved_state.ipb,
+		 vcpu->arch.xive_saved_state.pipr,
+		 vcpu->arch.xive_saved_state.w01,
+		 (u32) vcpu->arch.xive_cam_word, opal_state);
+
+	return 0;
+}
+
+int kvmppc_xive_native_set_vp(struct kvm_vcpu *vcpu, union kvmppc_one_reg *val)
+{
+	struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
+	struct kvmppc_xive *xive = vcpu->kvm->arch.xive;
+
+	pr_devel("%s w01=%016llx vp=%016llx\n", __func__,
+		 val->xive_timaval[0], val->xive_timaval[1]);
+
+	if (!kvmppc_xive_enabled(vcpu))
+		return -EPERM;
+
+	if (!xc || !xive)
+		return -ENOENT;
+
+	/* We can't update the state of a "pushed" VCPU	 */
+	if (WARN_ON(vcpu->arch.xive_pushed))
+		return -EBUSY;
+
+	/*
+	 * Restore the thread context registers. IPB and CPPR should
+	 * be the only ones that matter.
+	 */
+	vcpu->arch.xive_saved_state.w01 = val->xive_timaval[0];
+
+	/*
+	 * There is no need to restore the XIVE internal state (IPB
+	 * stored in the NVT) as the IPB register was merged in KVM VP
+	 * state when captured.
+	 */
+	return 0;
+}
+
 static int xive_native_debug_show(struct seq_file *m, void *private)
 {
 	struct kvmppc_xive *xive = m->private;
diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt
index e38eb17b7be6..5b505520a616 100644
--- a/Documentation/virtual/kvm/api.txt
+++ b/Documentation/virtual/kvm/api.txt
@@ -1985,6 +1985,7 @@ registers, find a list below:
   PPC   | KVM_REG_PPC_TLB3PS            | 32
   PPC   | KVM_REG_PPC_EPTCFG            | 32
   PPC   | KVM_REG_PPC_ICP_STATE         | 64
+  PPC   | KVM_REG_PPC_VP_STATE          | 128
   PPC   | KVM_REG_PPC_TB_OFFSET         | 64
   PPC   | KVM_REG_PPC_SPMC1             | 32
   PPC   | KVM_REG_PPC_SPMC2             | 32
diff --git a/Documentation/virtual/kvm/devices/xive.txt b/Documentation/virtual/kvm/devices/xive.txt
index 7ffd4c7be7b5..525d1eebcf34 100644
--- a/Documentation/virtual/kvm/devices/xive.txt
+++ b/Documentation/virtual/kvm/devices/xive.txt
@@ -107,6 +107,23 @@ the legacy interrupt mode, referred as XICS (POWER7/8).
     -ENOENT: Unknown source number
     -EINVAL: Not initialized source number
 
+* VCPU state
+
+  The XIVE IC maintains VP interrupt state in an internal structure
+  called the NVT. When a VP is not dispatched on a HW processor
+  thread, this structure can be updated by HW if the VP is the target
+  of an event notification.
+
+  It is important for migration to capture the cached IPB from the NVT
+  as it synthesizes the priorities of the pending interrupts. We
+  capture a bit more to report debug information.
+
+  KVM_REG_PPC_VP_STATE (2 * 64bits)
+  bits:     |  63  ....  32  |  31  ....  0  |
+  values:   |   TIMA word0   |   TIMA word1  |
+  bits:     | 127       ..........       64  |
+  values:   |            unused              |
+
 * Migration:
 
   Saving the state of a VM using the XIVE native exploitation mode
-- 
2.20.1


^ permalink raw reply related

* [PATCH v5 06/16] KVM: PPC: Book3S HV: XIVE: add controls for the EQ configuration
From: Cédric Le Goater @ 2019-04-10 17:04 UTC (permalink / raw)
  To: kvm-ppc
  Cc: kvm, Paul Mackerras, Cédric Le Goater, linuxppc-dev,
	David Gibson
In-Reply-To: <20190410170448.3923-1-clg@kaod.org>

These controls will be used by the H_INT_SET_QUEUE_CONFIG and
H_INT_GET_QUEUE_CONFIG hcalls from QEMU to configure the underlying
Event Queue in the XIVE IC. They will also be used to restore the
configuration of the XIVE EQs and to capture the internal run-time
state of the EQs. Both 'get' and 'set' rely on an OPAL call to access
the EQ toggle bit and EQ index which are updated by the XIVE IC when
event notifications are enqueued in the EQ.

The value of the guest physical address of the event queue is saved in
the XIVE internal xive_q structure for later use. That is when
migration needs to mark the EQ pages dirty to capture a consistent
memory state of the VM.

To be noted that H_INT_SET_QUEUE_CONFIG does not require the extra
OPAL call setting the EQ toggle bit and EQ index to configure the EQ,
but restoring the EQ state will.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
---

 Changes since v4 :

 - add check on EQ page alignment
 - add requirement on KVM_XIVE_EQ_ALWAYS_NOTIFY

 arch/powerpc/include/asm/xive.h            |   2 +
 arch/powerpc/include/uapi/asm/kvm.h        |  19 ++
 arch/powerpc/kvm/book3s_xive.h             |   2 +
 arch/powerpc/kvm/book3s_xive.c             |  15 +-
 arch/powerpc/kvm/book3s_xive_native.c      | 249 +++++++++++++++++++++
 Documentation/virtual/kvm/devices/xive.txt |  34 +++
 6 files changed, 315 insertions(+), 6 deletions(-)

diff --git a/arch/powerpc/include/asm/xive.h b/arch/powerpc/include/asm/xive.h
index b579a943407b..c4e88abd3b67 100644
--- a/arch/powerpc/include/asm/xive.h
+++ b/arch/powerpc/include/asm/xive.h
@@ -73,6 +73,8 @@ struct xive_q {
 	u32			esc_irq;
 	atomic_t		count;
 	atomic_t		pending_count;
+	u64			guest_qaddr;
+	u32			guest_qshift;
 };
 
 /* Global enable flags for the XIVE support */
diff --git a/arch/powerpc/include/uapi/asm/kvm.h b/arch/powerpc/include/uapi/asm/kvm.h
index e8161e21629b..85005400fd86 100644
--- a/arch/powerpc/include/uapi/asm/kvm.h
+++ b/arch/powerpc/include/uapi/asm/kvm.h
@@ -681,6 +681,7 @@ struct kvm_ppc_cpu_char {
 #define KVM_DEV_XIVE_GRP_CTRL		1
 #define KVM_DEV_XIVE_GRP_SOURCE		2	/* 64-bit source identifier */
 #define KVM_DEV_XIVE_GRP_SOURCE_CONFIG	3	/* 64-bit source identifier */
+#define KVM_DEV_XIVE_GRP_EQ_CONFIG	4	/* 64-bit EQ identifier */
 
 /* Layout of 64-bit XIVE source attribute values */
 #define KVM_XIVE_LEVEL_SENSITIVE	(1ULL << 0)
@@ -696,4 +697,22 @@ struct kvm_ppc_cpu_char {
 #define KVM_XIVE_SOURCE_EISN_SHIFT	33
 #define KVM_XIVE_SOURCE_EISN_MASK	0xfffffffe00000000ULL
 
+/* Layout of 64-bit EQ identifier */
+#define KVM_XIVE_EQ_PRIORITY_SHIFT	0
+#define KVM_XIVE_EQ_PRIORITY_MASK	0x7
+#define KVM_XIVE_EQ_SERVER_SHIFT	3
+#define KVM_XIVE_EQ_SERVER_MASK		0xfffffff8ULL
+
+/* Layout of EQ configuration values (64 bytes) */
+struct kvm_ppc_xive_eq {
+	__u32 flags;
+	__u32 qshift;
+	__u64 qaddr;
+	__u32 qtoggle;
+	__u32 qindex;
+	__u8  pad[40];
+};
+
+#define KVM_XIVE_EQ_ALWAYS_NOTIFY	0x00000001
+
 #endif /* __LINUX_KVM_POWERPC_H */
diff --git a/arch/powerpc/kvm/book3s_xive.h b/arch/powerpc/kvm/book3s_xive.h
index ae26fe653d98..622f594d93e1 100644
--- a/arch/powerpc/kvm/book3s_xive.h
+++ b/arch/powerpc/kvm/book3s_xive.h
@@ -272,6 +272,8 @@ struct kvmppc_xive_src_block *kvmppc_xive_create_src_block(
 	struct kvmppc_xive *xive, int irq);
 void kvmppc_xive_free_sources(struct kvmppc_xive_src_block *sb);
 int kvmppc_xive_select_target(struct kvm *kvm, u32 *server, u8 prio);
+int kvmppc_xive_attach_escalation(struct kvm_vcpu *vcpu, u8 prio,
+				  bool single_escalation);
 
 #endif /* CONFIG_KVM_XICS */
 #endif /* _KVM_PPC_BOOK3S_XICS_H */
diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c
index e09f3addffe5..c1b7aa7dbc28 100644
--- a/arch/powerpc/kvm/book3s_xive.c
+++ b/arch/powerpc/kvm/book3s_xive.c
@@ -166,7 +166,8 @@ static irqreturn_t xive_esc_irq(int irq, void *data)
 	return IRQ_HANDLED;
 }
 
-static int xive_attach_escalation(struct kvm_vcpu *vcpu, u8 prio)
+int kvmppc_xive_attach_escalation(struct kvm_vcpu *vcpu, u8 prio,
+				  bool single_escalation)
 {
 	struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
 	struct xive_q *q = &xc->queues[prio];
@@ -185,7 +186,7 @@ static int xive_attach_escalation(struct kvm_vcpu *vcpu, u8 prio)
 		return -EIO;
 	}
 
-	if (xc->xive->single_escalation)
+	if (single_escalation)
 		name = kasprintf(GFP_KERNEL, "kvm-%d-%d",
 				 vcpu->kvm->arch.lpid, xc->server_num);
 	else
@@ -217,7 +218,7 @@ static int xive_attach_escalation(struct kvm_vcpu *vcpu, u8 prio)
 	 * interrupt, thus leaving it effectively masked after
 	 * it fires once.
 	 */
-	if (xc->xive->single_escalation) {
+	if (single_escalation) {
 		struct irq_data *d = irq_get_irq_data(xc->esc_virq[prio]);
 		struct xive_irq_data *xd = irq_data_get_irq_handler_data(d);
 
@@ -291,7 +292,8 @@ static int xive_check_provisioning(struct kvm *kvm, u8 prio)
 			continue;
 		rc = xive_provision_queue(vcpu, prio);
 		if (rc == 0 && !xive->single_escalation)
-			xive_attach_escalation(vcpu, prio);
+			kvmppc_xive_attach_escalation(vcpu, prio,
+						      xive->single_escalation);
 		if (rc)
 			return rc;
 	}
@@ -1214,7 +1216,8 @@ int kvmppc_xive_connect_vcpu(struct kvm_device *dev,
 		if (xive->qmap & (1 << i)) {
 			r = xive_provision_queue(vcpu, i);
 			if (r == 0 && !xive->single_escalation)
-				xive_attach_escalation(vcpu, i);
+				kvmppc_xive_attach_escalation(
+					vcpu, i, xive->single_escalation);
 			if (r)
 				goto bail;
 		} else {
@@ -1229,7 +1232,7 @@ int kvmppc_xive_connect_vcpu(struct kvm_device *dev,
 	}
 
 	/* If not done above, attach priority 0 escalation */
-	r = xive_attach_escalation(vcpu, 0);
+	r = kvmppc_xive_attach_escalation(vcpu, 0, xive->single_escalation);
 	if (r)
 		goto bail;
 
diff --git a/arch/powerpc/kvm/book3s_xive_native.c b/arch/powerpc/kvm/book3s_xive_native.c
index 492825a35958..3e7cdcacc932 100644
--- a/arch/powerpc/kvm/book3s_xive_native.c
+++ b/arch/powerpc/kvm/book3s_xive_native.c
@@ -335,6 +335,243 @@ static int kvmppc_xive_native_set_source_config(struct kvmppc_xive *xive,
 						       priority, masked, eisn);
 }
 
+static int xive_native_validate_queue_size(u32 qshift)
+{
+	/*
+	 * We only support 64K pages for the moment. This is also
+	 * advertised in the DT property "ibm,xive-eq-sizes"
+	 */
+	switch (qshift) {
+	case 0: /* EQ reset */
+	case 16:
+		return 0;
+	case 12:
+	case 21:
+	case 24:
+	default:
+		return -EINVAL;
+	}
+}
+
+static int kvmppc_xive_native_set_queue_config(struct kvmppc_xive *xive,
+					       long eq_idx, u64 addr)
+{
+	struct kvm *kvm = xive->kvm;
+	struct kvm_vcpu *vcpu;
+	struct kvmppc_xive_vcpu *xc;
+	void __user *ubufp = (void __user *) addr;
+	u32 server;
+	u8 priority;
+	struct kvm_ppc_xive_eq kvm_eq;
+	int rc;
+	__be32 *qaddr = 0;
+	struct page *page;
+	struct xive_q *q;
+	gfn_t gfn;
+	unsigned long page_size;
+
+	/*
+	 * Demangle priority/server tuple from the EQ identifier
+	 */
+	priority = (eq_idx & KVM_XIVE_EQ_PRIORITY_MASK) >>
+		KVM_XIVE_EQ_PRIORITY_SHIFT;
+	server = (eq_idx & KVM_XIVE_EQ_SERVER_MASK) >>
+		KVM_XIVE_EQ_SERVER_SHIFT;
+
+	if (copy_from_user(&kvm_eq, ubufp, sizeof(kvm_eq)))
+		return -EFAULT;
+
+	vcpu = kvmppc_xive_find_server(kvm, server);
+	if (!vcpu) {
+		pr_err("Can't find server %d\n", server);
+		return -ENOENT;
+	}
+	xc = vcpu->arch.xive_vcpu;
+
+	if (priority != xive_prio_from_guest(priority)) {
+		pr_err("Trying to restore invalid queue %d for VCPU %d\n",
+		       priority, server);
+		return -EINVAL;
+	}
+	q = &xc->queues[priority];
+
+	pr_devel("%s VCPU %d priority %d fl:%x shift:%d addr:%llx g:%d idx:%d\n",
+		 __func__, server, priority, kvm_eq.flags,
+		 kvm_eq.qshift, kvm_eq.qaddr, kvm_eq.qtoggle, kvm_eq.qindex);
+
+	/*
+	 * sPAPR specifies a "Unconditional Notify (n) flag" for the
+	 * H_INT_SET_QUEUE_CONFIG hcall which forces notification
+	 * without using the coalescing mechanisms provided by the
+	 * XIVE END ESBs. This is required on KVM as notification
+	 * using the END ESBs is not supported.
+	 */
+	if (kvm_eq.flags != KVM_XIVE_EQ_ALWAYS_NOTIFY) {
+		pr_err("invalid flags %d\n", kvm_eq.flags);
+		return -EINVAL;
+	}
+
+	rc = xive_native_validate_queue_size(kvm_eq.qshift);
+	if (rc) {
+		pr_err("invalid queue size %d\n", kvm_eq.qshift);
+		return rc;
+	}
+
+	/* reset queue and disable queueing */
+	if (!kvm_eq.qshift) {
+		q->guest_qaddr  = 0;
+		q->guest_qshift = 0;
+
+		rc = xive_native_configure_queue(xc->vp_id, q, priority,
+						 NULL, 0, true);
+		if (rc) {
+			pr_err("Failed to reset queue %d for VCPU %d: %d\n",
+			       priority, xc->server_num, rc);
+			return rc;
+		}
+
+		if (q->qpage) {
+			put_page(virt_to_page(q->qpage));
+			q->qpage = NULL;
+		}
+
+		return 0;
+	}
+
+	if (kvm_eq.qaddr & ((1ull << kvm_eq.qshift) - 1)) {
+		pr_err("queue page is not aligned %llx/%llx\n", kvm_eq.qaddr,
+		       1ull << kvm_eq.qshift);
+		return -EINVAL;
+	}
+
+	gfn = gpa_to_gfn(kvm_eq.qaddr);
+	page = gfn_to_page(kvm, gfn);
+	if (is_error_page(page)) {
+		pr_err("Couldn't get queue page %llx!\n", kvm_eq.qaddr);
+		return -EINVAL;
+	}
+
+	page_size = kvm_host_page_size(kvm, gfn);
+	if (1ull << kvm_eq.qshift > page_size) {
+		pr_warn("Incompatible host page size %lx!\n", page_size);
+		return -EINVAL;
+	}
+
+	qaddr = page_to_virt(page) + (kvm_eq.qaddr & ~PAGE_MASK);
+
+	/*
+	 * Backup the queue page guest address to the mark EQ page
+	 * dirty for migration.
+	 */
+	q->guest_qaddr  = kvm_eq.qaddr;
+	q->guest_qshift = kvm_eq.qshift;
+
+	 /*
+	  * Unconditional Notification is forced by default at the
+	  * OPAL level because the use of END ESBs is not supported by
+	  * Linux.
+	  */
+	rc = xive_native_configure_queue(xc->vp_id, q, priority,
+					 (__be32 *) qaddr, kvm_eq.qshift, true);
+	if (rc) {
+		pr_err("Failed to configure queue %d for VCPU %d: %d\n",
+		       priority, xc->server_num, rc);
+		put_page(page);
+		return rc;
+	}
+
+	/*
+	 * Only restore the queue state when needed. When doing the
+	 * H_INT_SET_SOURCE_CONFIG hcall, it should not.
+	 */
+	if (kvm_eq.qtoggle != 1 || kvm_eq.qindex != 0) {
+		rc = xive_native_set_queue_state(xc->vp_id, priority,
+						 kvm_eq.qtoggle,
+						 kvm_eq.qindex);
+		if (rc)
+			goto error;
+	}
+
+	rc = kvmppc_xive_attach_escalation(vcpu, priority,
+					   xive->single_escalation);
+error:
+	if (rc)
+		kvmppc_xive_native_cleanup_queue(vcpu, priority);
+	return rc;
+}
+
+static int kvmppc_xive_native_get_queue_config(struct kvmppc_xive *xive,
+					       long eq_idx, u64 addr)
+{
+	struct kvm *kvm = xive->kvm;
+	struct kvm_vcpu *vcpu;
+	struct kvmppc_xive_vcpu *xc;
+	struct xive_q *q;
+	void __user *ubufp = (u64 __user *) addr;
+	u32 server;
+	u8 priority;
+	struct kvm_ppc_xive_eq kvm_eq;
+	u64 qaddr;
+	u64 qshift;
+	u64 qeoi_page;
+	u32 escalate_irq;
+	u64 qflags;
+	int rc;
+
+	/*
+	 * Demangle priority/server tuple from the EQ identifier
+	 */
+	priority = (eq_idx & KVM_XIVE_EQ_PRIORITY_MASK) >>
+		KVM_XIVE_EQ_PRIORITY_SHIFT;
+	server = (eq_idx & KVM_XIVE_EQ_SERVER_MASK) >>
+		KVM_XIVE_EQ_SERVER_SHIFT;
+
+	vcpu = kvmppc_xive_find_server(kvm, server);
+	if (!vcpu) {
+		pr_err("Can't find server %d\n", server);
+		return -ENOENT;
+	}
+	xc = vcpu->arch.xive_vcpu;
+
+	if (priority != xive_prio_from_guest(priority)) {
+		pr_err("invalid priority for queue %d for VCPU %d\n",
+		       priority, server);
+		return -EINVAL;
+	}
+	q = &xc->queues[priority];
+
+	memset(&kvm_eq, 0, sizeof(kvm_eq));
+
+	if (!q->qpage)
+		return 0;
+
+	rc = xive_native_get_queue_info(xc->vp_id, priority, &qaddr, &qshift,
+					&qeoi_page, &escalate_irq, &qflags);
+	if (rc)
+		return rc;
+
+	kvm_eq.flags = 0;
+	if (qflags & OPAL_XIVE_EQ_ALWAYS_NOTIFY)
+		kvm_eq.flags |= KVM_XIVE_EQ_ALWAYS_NOTIFY;
+
+	kvm_eq.qshift = q->guest_qshift;
+	kvm_eq.qaddr  = q->guest_qaddr;
+
+	rc = xive_native_get_queue_state(xc->vp_id, priority, &kvm_eq.qtoggle,
+					 &kvm_eq.qindex);
+	if (rc)
+		return rc;
+
+	pr_devel("%s VCPU %d priority %d fl:%x shift:%d addr:%llx g:%d idx:%d\n",
+		 __func__, server, priority, kvm_eq.flags,
+		 kvm_eq.qshift, kvm_eq.qaddr, kvm_eq.qtoggle, kvm_eq.qindex);
+
+	if (copy_to_user(ubufp, &kvm_eq, sizeof(kvm_eq)))
+		return -EFAULT;
+
+	return 0;
+}
+
 static int kvmppc_xive_native_set_attr(struct kvm_device *dev,
 				       struct kvm_device_attr *attr)
 {
@@ -349,6 +586,9 @@ static int kvmppc_xive_native_set_attr(struct kvm_device *dev,
 	case KVM_DEV_XIVE_GRP_SOURCE_CONFIG:
 		return kvmppc_xive_native_set_source_config(xive, attr->attr,
 							    attr->addr);
+	case KVM_DEV_XIVE_GRP_EQ_CONFIG:
+		return kvmppc_xive_native_set_queue_config(xive, attr->attr,
+							   attr->addr);
 	}
 	return -ENXIO;
 }
@@ -356,6 +596,13 @@ static int kvmppc_xive_native_set_attr(struct kvm_device *dev,
 static int kvmppc_xive_native_get_attr(struct kvm_device *dev,
 				       struct kvm_device_attr *attr)
 {
+	struct kvmppc_xive *xive = dev->private;
+
+	switch (attr->group) {
+	case KVM_DEV_XIVE_GRP_EQ_CONFIG:
+		return kvmppc_xive_native_get_queue_config(xive, attr->attr,
+							   attr->addr);
+	}
 	return -ENXIO;
 }
 
@@ -371,6 +618,8 @@ static int kvmppc_xive_native_has_attr(struct kvm_device *dev,
 		    attr->attr < KVMPPC_XIVE_NR_IRQS)
 			return 0;
 		break;
+	case KVM_DEV_XIVE_GRP_EQ_CONFIG:
+		return 0;
 	}
 	return -ENXIO;
 }
diff --git a/Documentation/virtual/kvm/devices/xive.txt b/Documentation/virtual/kvm/devices/xive.txt
index 33c64b2cdbe8..cc13bfd5cf53 100644
--- a/Documentation/virtual/kvm/devices/xive.txt
+++ b/Documentation/virtual/kvm/devices/xive.txt
@@ -53,3 +53,37 @@ the legacy interrupt mode, referred as XICS (POWER7/8).
     -ENXIO:  CPU event queues not configured or configuration of the
              underlying HW interrupt failed
     -EBUSY:  No CPU available to serve interrupt
+
+  4. KVM_DEV_XIVE_GRP_EQ_CONFIG (read-write)
+  Configures an event queue of a CPU
+  Attributes:
+    EQ descriptor identifier (64-bit)
+  The EQ descriptor identifier is a tuple (server, priority) :
+  bits:     | 63   ....  32 | 31 .. 3 |  2 .. 0
+  values:   |    unused     |  server | priority
+  The kvm_device_attr.addr points to :
+    struct kvm_ppc_xive_eq {
+	__u32 flags;
+	__u32 qshift;
+	__u64 qaddr;
+	__u32 qtoggle;
+	__u32 qindex;
+	__u8  pad[40];
+    };
+  - flags: queue flags
+    KVM_XIVE_EQ_ALWAYS_NOTIFY (required)
+	forces notification without using the coalescing mechanism
+	provided by the XIVE END ESBs.
+  - qshift: queue size (power of 2)
+  - qaddr: real address of queue
+  - qtoggle: current queue toggle bit
+  - qindex: current queue index
+  - pad: reserved for future use
+  Errors:
+    -ENOENT: Invalid CPU number
+    -EINVAL: Invalid priority
+    -EINVAL: Invalid flags
+    -EINVAL: Invalid queue size
+    -EINVAL: Invalid queue address
+    -EFAULT: Invalid user pointer for attr->addr.
+    -EIO:    Configuration of the underlying HW failed
-- 
2.20.1


^ permalink raw reply related

* [PATCH v5 05/16] KVM: PPC: Book3S HV: XIVE: add a control to configure a source
From: Cédric Le Goater @ 2019-04-10 17:04 UTC (permalink / raw)
  To: kvm-ppc
  Cc: kvm, Paul Mackerras, Cédric Le Goater, linuxppc-dev,
	David Gibson
In-Reply-To: <20190410170448.3923-1-clg@kaod.org>

This control will be used by the H_INT_SET_SOURCE_CONFIG hcall from
QEMU to configure the target of a source and also to restore the
configuration of a source when migrating the VM.

The XIVE source interrupt structure is extended with the value of the
Effective Interrupt Source Number. The EISN is the interrupt number
pushed in the event queue that the guest OS will use to dispatch
events internally. Caching the EISN value in KVM eases the test when
checking if a reconfiguration is indeed needed.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
---
 arch/powerpc/include/uapi/asm/kvm.h        | 11 +++
 arch/powerpc/kvm/book3s_xive.h             |  4 +
 arch/powerpc/kvm/book3s_xive.c             |  5 +-
 arch/powerpc/kvm/book3s_xive_native.c      | 97 ++++++++++++++++++++++
 Documentation/virtual/kvm/devices/xive.txt | 21 +++++
 5 files changed, 136 insertions(+), 2 deletions(-)

diff --git a/arch/powerpc/include/uapi/asm/kvm.h b/arch/powerpc/include/uapi/asm/kvm.h
index d468294c2a67..e8161e21629b 100644
--- a/arch/powerpc/include/uapi/asm/kvm.h
+++ b/arch/powerpc/include/uapi/asm/kvm.h
@@ -680,9 +680,20 @@ struct kvm_ppc_cpu_char {
 /* POWER9 XIVE Native Interrupt Controller */
 #define KVM_DEV_XIVE_GRP_CTRL		1
 #define KVM_DEV_XIVE_GRP_SOURCE		2	/* 64-bit source identifier */
+#define KVM_DEV_XIVE_GRP_SOURCE_CONFIG	3	/* 64-bit source identifier */
 
 /* Layout of 64-bit XIVE source attribute values */
 #define KVM_XIVE_LEVEL_SENSITIVE	(1ULL << 0)
 #define KVM_XIVE_LEVEL_ASSERTED		(1ULL << 1)
 
+/* Layout of 64-bit XIVE source configuration attribute values */
+#define KVM_XIVE_SOURCE_PRIORITY_SHIFT	0
+#define KVM_XIVE_SOURCE_PRIORITY_MASK	0x7
+#define KVM_XIVE_SOURCE_SERVER_SHIFT	3
+#define KVM_XIVE_SOURCE_SERVER_MASK	0xfffffff8ULL
+#define KVM_XIVE_SOURCE_MASKED_SHIFT	32
+#define KVM_XIVE_SOURCE_MASKED_MASK	0x100000000ULL
+#define KVM_XIVE_SOURCE_EISN_SHIFT	33
+#define KVM_XIVE_SOURCE_EISN_MASK	0xfffffffe00000000ULL
+
 #endif /* __LINUX_KVM_POWERPC_H */
diff --git a/arch/powerpc/kvm/book3s_xive.h b/arch/powerpc/kvm/book3s_xive.h
index 1be921cb5dcb..ae26fe653d98 100644
--- a/arch/powerpc/kvm/book3s_xive.h
+++ b/arch/powerpc/kvm/book3s_xive.h
@@ -61,6 +61,9 @@ struct kvmppc_xive_irq_state {
 	bool saved_p;
 	bool saved_q;
 	u8 saved_scan_prio;
+
+	/* Xive native */
+	u32 eisn;			/* Guest Effective IRQ number */
 };
 
 /* Select the "right" interrupt (IPI vs. passthrough) */
@@ -268,6 +271,7 @@ int kvmppc_xive_debug_show_queues(struct seq_file *m, struct kvm_vcpu *vcpu);
 struct kvmppc_xive_src_block *kvmppc_xive_create_src_block(
 	struct kvmppc_xive *xive, int irq);
 void kvmppc_xive_free_sources(struct kvmppc_xive_src_block *sb);
+int kvmppc_xive_select_target(struct kvm *kvm, u32 *server, u8 prio);
 
 #endif /* CONFIG_KVM_XICS */
 #endif /* _KVM_PPC_BOOK3S_XICS_H */
diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c
index 6c9f9fd0855f..e09f3addffe5 100644
--- a/arch/powerpc/kvm/book3s_xive.c
+++ b/arch/powerpc/kvm/book3s_xive.c
@@ -342,7 +342,7 @@ static int xive_try_pick_queue(struct kvm_vcpu *vcpu, u8 prio)
 	return atomic_add_unless(&q->count, 1, max) ? 0 : -EBUSY;
 }
 
-static int xive_select_target(struct kvm *kvm, u32 *server, u8 prio)
+int kvmppc_xive_select_target(struct kvm *kvm, u32 *server, u8 prio)
 {
 	struct kvm_vcpu *vcpu;
 	int i, rc;
@@ -530,7 +530,7 @@ static int xive_target_interrupt(struct kvm *kvm,
 	 * priority. The count for that new target will have
 	 * already been incremented.
 	 */
-	rc = xive_select_target(kvm, &server, prio);
+	rc = kvmppc_xive_select_target(kvm, &server, prio);
 
 	/*
 	 * We failed to find a target ? Not much we can do
@@ -1504,6 +1504,7 @@ struct kvmppc_xive_src_block *kvmppc_xive_create_src_block(
 
 	for (i = 0; i < KVMPPC_XICS_IRQ_PER_ICS; i++) {
 		sb->irq_state[i].number = (bid << KVMPPC_XICS_ICS_SHIFT) | i;
+		sb->irq_state[i].eisn = 0;
 		sb->irq_state[i].guest_priority = MASKED;
 		sb->irq_state[i].saved_priority = MASKED;
 		sb->irq_state[i].act_priority = MASKED;
diff --git a/arch/powerpc/kvm/book3s_xive_native.c b/arch/powerpc/kvm/book3s_xive_native.c
index 5f2bd6c137b7..492825a35958 100644
--- a/arch/powerpc/kvm/book3s_xive_native.c
+++ b/arch/powerpc/kvm/book3s_xive_native.c
@@ -242,6 +242,99 @@ static int kvmppc_xive_native_set_source(struct kvmppc_xive *xive, long irq,
 	return rc;
 }
 
+static int kvmppc_xive_native_update_source_config(struct kvmppc_xive *xive,
+					struct kvmppc_xive_src_block *sb,
+					struct kvmppc_xive_irq_state *state,
+					u32 server, u8 priority, bool masked,
+					u32 eisn)
+{
+	struct kvm *kvm = xive->kvm;
+	u32 hw_num;
+	int rc = 0;
+
+	arch_spin_lock(&sb->lock);
+
+	if (state->act_server == server && state->act_priority == priority &&
+	    state->eisn == eisn)
+		goto unlock;
+
+	pr_devel("new_act_prio=%d new_act_server=%d mask=%d act_server=%d act_prio=%d\n",
+		 priority, server, masked, state->act_server,
+		 state->act_priority);
+
+	kvmppc_xive_select_irq(state, &hw_num, NULL);
+
+	if (priority != MASKED && !masked) {
+		rc = kvmppc_xive_select_target(kvm, &server, priority);
+		if (rc)
+			goto unlock;
+
+		state->act_priority = priority;
+		state->act_server = server;
+		state->eisn = eisn;
+
+		rc = xive_native_configure_irq(hw_num,
+					       kvmppc_xive_vp(xive, server),
+					       priority, eisn);
+	} else {
+		state->act_priority = MASKED;
+		state->act_server = 0;
+		state->eisn = 0;
+
+		rc = xive_native_configure_irq(hw_num, 0, MASKED, 0);
+	}
+
+unlock:
+	arch_spin_unlock(&sb->lock);
+	return rc;
+}
+
+static int kvmppc_xive_native_set_source_config(struct kvmppc_xive *xive,
+						long irq, u64 addr)
+{
+	struct kvmppc_xive_src_block *sb;
+	struct kvmppc_xive_irq_state *state;
+	u64 __user *ubufp = (u64 __user *) addr;
+	u16 src;
+	u64 kvm_cfg;
+	u32 server;
+	u8 priority;
+	bool masked;
+	u32 eisn;
+
+	sb = kvmppc_xive_find_source(xive, irq, &src);
+	if (!sb)
+		return -ENOENT;
+
+	state = &sb->irq_state[src];
+
+	if (!state->valid)
+		return -EINVAL;
+
+	if (get_user(kvm_cfg, ubufp))
+		return -EFAULT;
+
+	pr_devel("%s irq=0x%lx cfg=%016llx\n", __func__, irq, kvm_cfg);
+
+	priority = (kvm_cfg & KVM_XIVE_SOURCE_PRIORITY_MASK) >>
+		KVM_XIVE_SOURCE_PRIORITY_SHIFT;
+	server = (kvm_cfg & KVM_XIVE_SOURCE_SERVER_MASK) >>
+		KVM_XIVE_SOURCE_SERVER_SHIFT;
+	masked = (kvm_cfg & KVM_XIVE_SOURCE_MASKED_MASK) >>
+		KVM_XIVE_SOURCE_MASKED_SHIFT;
+	eisn = (kvm_cfg & KVM_XIVE_SOURCE_EISN_MASK) >>
+		KVM_XIVE_SOURCE_EISN_SHIFT;
+
+	if (priority != xive_prio_from_guest(priority)) {
+		pr_err("invalid priority for queue %d for VCPU %d\n",
+		       priority, server);
+		return -EINVAL;
+	}
+
+	return kvmppc_xive_native_update_source_config(xive, sb, state, server,
+						       priority, masked, eisn);
+}
+
 static int kvmppc_xive_native_set_attr(struct kvm_device *dev,
 				       struct kvm_device_attr *attr)
 {
@@ -253,6 +346,9 @@ static int kvmppc_xive_native_set_attr(struct kvm_device *dev,
 	case KVM_DEV_XIVE_GRP_SOURCE:
 		return kvmppc_xive_native_set_source(xive, attr->attr,
 						     attr->addr);
+	case KVM_DEV_XIVE_GRP_SOURCE_CONFIG:
+		return kvmppc_xive_native_set_source_config(xive, attr->attr,
+							    attr->addr);
 	}
 	return -ENXIO;
 }
@@ -270,6 +366,7 @@ static int kvmppc_xive_native_has_attr(struct kvm_device *dev,
 	case KVM_DEV_XIVE_GRP_CTRL:
 		break;
 	case KVM_DEV_XIVE_GRP_SOURCE:
+	case KVM_DEV_XIVE_GRP_SOURCE_CONFIG:
 		if (attr->attr >= KVMPPC_XIVE_FIRST_IRQ &&
 		    attr->attr < KVMPPC_XIVE_NR_IRQS)
 			return 0;
diff --git a/Documentation/virtual/kvm/devices/xive.txt b/Documentation/virtual/kvm/devices/xive.txt
index cd8bfc37b72e..33c64b2cdbe8 100644
--- a/Documentation/virtual/kvm/devices/xive.txt
+++ b/Documentation/virtual/kvm/devices/xive.txt
@@ -32,3 +32,24 @@ the legacy interrupt mode, referred as XICS (POWER7/8).
     -ENOMEM: Could not create a new source block
     -EFAULT: Invalid user pointer for attr->addr.
     -ENXIO:  Could not allocate underlying HW interrupt
+
+  3. KVM_DEV_XIVE_GRP_SOURCE_CONFIG (write only)
+  Configures source targeting
+  Attributes:
+    Interrupt source number  (64-bit)
+  The kvm_device_attr.addr points to a __u64 value:
+  bits:     | 63   ....  33 |  32  | 31 .. 3 |  2 .. 0
+  values:   |    eisn       | mask |  server | priority
+  - priority: 0-7 interrupt priority level
+  - server: CPU number chosen to handle the interrupt
+  - mask: mask flag (unused)
+  - eisn: Effective Interrupt Source Number
+  Errors:
+    -ENOENT: Unknown source number
+    -EINVAL: Not initialized source number
+    -EINVAL: Invalid priority
+    -EINVAL: Invalid CPU number.
+    -EFAULT: Invalid user pointer for attr->addr.
+    -ENXIO:  CPU event queues not configured or configuration of the
+             underlying HW interrupt failed
+    -EBUSY:  No CPU available to serve interrupt
-- 
2.20.1


^ permalink raw reply related

* [PATCH v5 04/16] KVM: PPC: Book3S HV: XIVE: add a control to initialize a source
From: Cédric Le Goater @ 2019-04-10 17:04 UTC (permalink / raw)
  To: kvm-ppc
  Cc: kvm, Paul Mackerras, Cédric Le Goater, linuxppc-dev,
	David Gibson
In-Reply-To: <20190410170448.3923-1-clg@kaod.org>

The XIVE KVM device maintains a list of interrupt sources for the VM
which are allocated in the pool of generic interrupts (IPIs) of the
main XIVE IC controller. These are used for the CPU IPIs as well as
for virtual device interrupts. The IRQ number space is defined by
QEMU.

The XIVE device reuses the source structures of the XICS-on-XIVE
device for the source blocks (2-level tree) and for the source
interrupts. Under XIVE native, the source interrupt caches mostly
configuration information and is less used than under the XICS-on-XIVE
device in which hcalls are still necessary at run-time.

When a source is initialized in KVM, an IPI interrupt source is simply
allocated at the OPAL level and then MASKED. KVM only needs to know
about its type: LSI or MSI.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
---
 arch/powerpc/include/uapi/asm/kvm.h        |   5 +
 arch/powerpc/kvm/book3s_xive.h             |  10 ++
 arch/powerpc/kvm/book3s_xive.c             |   8 +-
 arch/powerpc/kvm/book3s_xive_native.c      | 106 +++++++++++++++++++++
 Documentation/virtual/kvm/devices/xive.txt |  15 +++
 5 files changed, 140 insertions(+), 4 deletions(-)

diff --git a/arch/powerpc/include/uapi/asm/kvm.h b/arch/powerpc/include/uapi/asm/kvm.h
index be0ce1f17625..d468294c2a67 100644
--- a/arch/powerpc/include/uapi/asm/kvm.h
+++ b/arch/powerpc/include/uapi/asm/kvm.h
@@ -679,5 +679,10 @@ struct kvm_ppc_cpu_char {
 
 /* POWER9 XIVE Native Interrupt Controller */
 #define KVM_DEV_XIVE_GRP_CTRL		1
+#define KVM_DEV_XIVE_GRP_SOURCE		2	/* 64-bit source identifier */
+
+/* Layout of 64-bit XIVE source attribute values */
+#define KVM_XIVE_LEVEL_SENSITIVE	(1ULL << 0)
+#define KVM_XIVE_LEVEL_ASSERTED		(1ULL << 1)
 
 #endif /* __LINUX_KVM_POWERPC_H */
diff --git a/arch/powerpc/kvm/book3s_xive.h b/arch/powerpc/kvm/book3s_xive.h
index d366df69b9cb..1be921cb5dcb 100644
--- a/arch/powerpc/kvm/book3s_xive.h
+++ b/arch/powerpc/kvm/book3s_xive.h
@@ -12,6 +12,13 @@
 #ifdef CONFIG_KVM_XICS
 #include "book3s_xics.h"
 
+/*
+ * The XIVE Interrupt source numbers are within the range 0 to
+ * KVMPPC_XICS_NR_IRQS.
+ */
+#define KVMPPC_XIVE_FIRST_IRQ	0
+#define KVMPPC_XIVE_NR_IRQS	KVMPPC_XICS_NR_IRQS
+
 /*
  * State for one guest irq source.
  *
@@ -258,6 +265,9 @@ extern int (*__xive_vm_h_eoi)(struct kvm_vcpu *vcpu, unsigned long xirr);
  */
 void kvmppc_xive_disable_vcpu_interrupts(struct kvm_vcpu *vcpu);
 int kvmppc_xive_debug_show_queues(struct seq_file *m, struct kvm_vcpu *vcpu);
+struct kvmppc_xive_src_block *kvmppc_xive_create_src_block(
+	struct kvmppc_xive *xive, int irq);
+void kvmppc_xive_free_sources(struct kvmppc_xive_src_block *sb);
 
 #endif /* CONFIG_KVM_XICS */
 #endif /* _KVM_PPC_BOOK3S_XICS_H */
diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c
index e7f1ada1c3de..6c9f9fd0855f 100644
--- a/arch/powerpc/kvm/book3s_xive.c
+++ b/arch/powerpc/kvm/book3s_xive.c
@@ -1480,8 +1480,8 @@ static int xive_get_source(struct kvmppc_xive *xive, long irq, u64 addr)
 	return 0;
 }
 
-static struct kvmppc_xive_src_block *xive_create_src_block(struct kvmppc_xive *xive,
-							   int irq)
+struct kvmppc_xive_src_block *kvmppc_xive_create_src_block(
+	struct kvmppc_xive *xive, int irq)
 {
 	struct kvm *kvm = xive->kvm;
 	struct kvmppc_xive_src_block *sb;
@@ -1560,7 +1560,7 @@ static int xive_set_source(struct kvmppc_xive *xive, long irq, u64 addr)
 	sb = kvmppc_xive_find_source(xive, irq, &idx);
 	if (!sb) {
 		pr_devel("No source, creating source block...\n");
-		sb = xive_create_src_block(xive, irq);
+		sb = kvmppc_xive_create_src_block(xive, irq);
 		if (!sb) {
 			pr_devel("Failed to create block...\n");
 			return -ENOMEM;
@@ -1784,7 +1784,7 @@ static void kvmppc_xive_cleanup_irq(u32 hw_num, struct xive_irq_data *xd)
 	xive_cleanup_irq_data(xd);
 }
 
-static void kvmppc_xive_free_sources(struct kvmppc_xive_src_block *sb)
+void kvmppc_xive_free_sources(struct kvmppc_xive_src_block *sb)
 {
 	int i;
 
diff --git a/arch/powerpc/kvm/book3s_xive_native.c b/arch/powerpc/kvm/book3s_xive_native.c
index 6fa73cfd9d9c..5f2bd6c137b7 100644
--- a/arch/powerpc/kvm/book3s_xive_native.c
+++ b/arch/powerpc/kvm/book3s_xive_native.c
@@ -26,6 +26,17 @@
 
 #include "book3s_xive.h"
 
+static u8 xive_vm_esb_load(struct xive_irq_data *xd, u32 offset)
+{
+	u64 val;
+
+	if (xd->flags & XIVE_IRQ_FLAG_SHIFT_BUG)
+		offset |= offset << 4;
+
+	val = in_be64(xd->eoi_mmio + offset);
+	return (u8)val;
+}
+
 static void kvmppc_xive_native_cleanup_queue(struct kvm_vcpu *vcpu, int prio)
 {
 	struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
@@ -154,12 +165,94 @@ int kvmppc_xive_native_connect_vcpu(struct kvm_device *dev,
 	return rc;
 }
 
+static int kvmppc_xive_native_set_source(struct kvmppc_xive *xive, long irq,
+					 u64 addr)
+{
+	struct kvmppc_xive_src_block *sb;
+	struct kvmppc_xive_irq_state *state;
+	u64 __user *ubufp = (u64 __user *) addr;
+	u64 val;
+	u16 idx;
+	int rc;
+
+	pr_devel("%s irq=0x%lx\n", __func__, irq);
+
+	if (irq < KVMPPC_XIVE_FIRST_IRQ || irq >= KVMPPC_XIVE_NR_IRQS)
+		return -E2BIG;
+
+	sb = kvmppc_xive_find_source(xive, irq, &idx);
+	if (!sb) {
+		pr_debug("No source, creating source block...\n");
+		sb = kvmppc_xive_create_src_block(xive, irq);
+		if (!sb) {
+			pr_err("Failed to create block...\n");
+			return -ENOMEM;
+		}
+	}
+	state = &sb->irq_state[idx];
+
+	if (get_user(val, ubufp)) {
+		pr_err("fault getting user info !\n");
+		return -EFAULT;
+	}
+
+	arch_spin_lock(&sb->lock);
+
+	/*
+	 * If the source doesn't already have an IPI, allocate
+	 * one and get the corresponding data
+	 */
+	if (!state->ipi_number) {
+		state->ipi_number = xive_native_alloc_irq();
+		if (state->ipi_number == 0) {
+			pr_err("Failed to allocate IRQ !\n");
+			rc = -ENXIO;
+			goto unlock;
+		}
+		xive_native_populate_irq_data(state->ipi_number,
+					      &state->ipi_data);
+		pr_debug("%s allocated hw_irq=0x%x for irq=0x%lx\n", __func__,
+			 state->ipi_number, irq);
+	}
+
+	/* Restore LSI state */
+	if (val & KVM_XIVE_LEVEL_SENSITIVE) {
+		state->lsi = true;
+		if (val & KVM_XIVE_LEVEL_ASSERTED)
+			state->asserted = true;
+		pr_devel("  LSI ! Asserted=%d\n", state->asserted);
+	}
+
+	/* Mask IRQ to start with */
+	state->act_server = 0;
+	state->act_priority = MASKED;
+	xive_vm_esb_load(&state->ipi_data, XIVE_ESB_SET_PQ_01);
+	xive_native_configure_irq(state->ipi_number, 0, MASKED, 0);
+
+	/* Increment the number of valid sources and mark this one valid */
+	if (!state->valid)
+		xive->src_count++;
+	state->valid = true;
+
+	rc = 0;
+
+unlock:
+	arch_spin_unlock(&sb->lock);
+
+	return rc;
+}
+
 static int kvmppc_xive_native_set_attr(struct kvm_device *dev,
 				       struct kvm_device_attr *attr)
 {
+	struct kvmppc_xive *xive = dev->private;
+
 	switch (attr->group) {
 	case KVM_DEV_XIVE_GRP_CTRL:
 		break;
+	case KVM_DEV_XIVE_GRP_SOURCE:
+		return kvmppc_xive_native_set_source(xive, attr->attr,
+						     attr->addr);
 	}
 	return -ENXIO;
 }
@@ -176,6 +269,11 @@ static int kvmppc_xive_native_has_attr(struct kvm_device *dev,
 	switch (attr->group) {
 	case KVM_DEV_XIVE_GRP_CTRL:
 		break;
+	case KVM_DEV_XIVE_GRP_SOURCE:
+		if (attr->attr >= KVMPPC_XIVE_FIRST_IRQ &&
+		    attr->attr < KVMPPC_XIVE_NR_IRQS)
+			return 0;
+		break;
 	}
 	return -ENXIO;
 }
@@ -184,6 +282,7 @@ static void kvmppc_xive_native_free(struct kvm_device *dev)
 {
 	struct kvmppc_xive *xive = dev->private;
 	struct kvm *kvm = xive->kvm;
+	int i;
 
 	debugfs_remove(xive->dentry);
 
@@ -192,6 +291,13 @@ static void kvmppc_xive_native_free(struct kvm_device *dev)
 	if (kvm)
 		kvm->arch.xive = NULL;
 
+	for (i = 0; i <= xive->max_sbid; i++) {
+		if (xive->src_blocks[i])
+			kvmppc_xive_free_sources(xive->src_blocks[i]);
+		kfree(xive->src_blocks[i]);
+		xive->src_blocks[i] = NULL;
+	}
+
 	if (xive->vp_base != XIVE_INVALID_VP)
 		xive_native_free_vp_block(xive->vp_base);
 
diff --git a/Documentation/virtual/kvm/devices/xive.txt b/Documentation/virtual/kvm/devices/xive.txt
index fdbd2ff92a88..cd8bfc37b72e 100644
--- a/Documentation/virtual/kvm/devices/xive.txt
+++ b/Documentation/virtual/kvm/devices/xive.txt
@@ -17,3 +17,18 @@ the legacy interrupt mode, referred as XICS (POWER7/8).
 
   1. KVM_DEV_XIVE_GRP_CTRL
   Provides global controls on the device
+
+  2. KVM_DEV_XIVE_GRP_SOURCE (write only)
+  Initializes a new source in the XIVE device and mask it.
+  Attributes:
+    Interrupt source number  (64-bit)
+  The kvm_device_attr.addr points to a __u64 value:
+  bits:     | 63   ....  2 |   1   |   0
+  values:   |    unused    | level | type
+  - type:  0:MSI 1:LSI
+  - level: assertion level in case of an LSI.
+  Errors:
+    -E2BIG:  Interrupt source number is out of range
+    -ENOMEM: Could not create a new source block
+    -EFAULT: Invalid user pointer for attr->addr.
+    -ENXIO:  Could not allocate underlying HW interrupt
-- 
2.20.1


^ permalink raw reply related

* [PATCH v5 03/16] KVM: PPC: Book3S HV: XIVE: introduce a new capability KVM_CAP_PPC_IRQ_XIVE
From: Cédric Le Goater @ 2019-04-10 17:04 UTC (permalink / raw)
  To: kvm-ppc
  Cc: kvm, Paul Mackerras, Cédric Le Goater, linuxppc-dev,
	David Gibson
In-Reply-To: <20190410170448.3923-1-clg@kaod.org>

The user interface exposes a new capability KVM_CAP_PPC_IRQ_XIVE to
let QEMU connect the vCPU presenters to the XIVE KVM device if
required. The capability is not advertised for now as the full support
for the XIVE native exploitation mode is not yet available. When this
is case, the capability will be advertised on PowerNV Hypervisors
only. Nested guests (pseries KVM Hypervisor) are not supported.

Internally, the interface to the new KVM device is protected with a
new interrupt mode: KVMPPC_IRQ_XIVE.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
---
 arch/powerpc/include/asm/kvm_host.h   |   1 +
 arch/powerpc/include/asm/kvm_ppc.h    |  13 +++
 arch/powerpc/kvm/book3s_xive.h        |  11 ++
 include/uapi/linux/kvm.h              |   1 +
 arch/powerpc/kvm/book3s_xive.c        |  88 ++++++++-------
 arch/powerpc/kvm/book3s_xive_native.c | 150 ++++++++++++++++++++++++++
 arch/powerpc/kvm/powerpc.c            |  36 +++++++
 Documentation/virtual/kvm/api.txt     |   9 ++
 8 files changed, 268 insertions(+), 41 deletions(-)

diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h
index 008523224e7a..9cc6abdce1b9 100644
--- a/arch/powerpc/include/asm/kvm_host.h
+++ b/arch/powerpc/include/asm/kvm_host.h
@@ -450,6 +450,7 @@ struct kvmppc_passthru_irqmap {
 #define KVMPPC_IRQ_DEFAULT	0
 #define KVMPPC_IRQ_MPIC		1
 #define KVMPPC_IRQ_XICS		2 /* Includes a XIVE option */
+#define KVMPPC_IRQ_XIVE		3 /* XIVE native exploitation mode */
 
 #define MMIO_HPTE_CACHE_SIZE	4
 
diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h
index f3383e76017a..6928a35ac3c7 100644
--- a/arch/powerpc/include/asm/kvm_ppc.h
+++ b/arch/powerpc/include/asm/kvm_ppc.h
@@ -595,6 +595,14 @@ extern int kvmppc_xive_set_irq(struct kvm *kvm, int irq_source_id, u32 irq,
 			       int level, bool line_status);
 extern void kvmppc_xive_push_vcpu(struct kvm_vcpu *vcpu);
 
+static inline int kvmppc_xive_enabled(struct kvm_vcpu *vcpu)
+{
+	return vcpu->arch.irq_type == KVMPPC_IRQ_XIVE;
+}
+
+extern int kvmppc_xive_native_connect_vcpu(struct kvm_device *dev,
+					   struct kvm_vcpu *vcpu, u32 cpu);
+extern void kvmppc_xive_native_cleanup_vcpu(struct kvm_vcpu *vcpu);
 extern void kvmppc_xive_native_init_module(void);
 extern void kvmppc_xive_native_exit_module(void);
 
@@ -622,6 +630,11 @@ static inline int kvmppc_xive_set_irq(struct kvm *kvm, int irq_source_id, u32 ir
 				      int level, bool line_status) { return -ENODEV; }
 static inline void kvmppc_xive_push_vcpu(struct kvm_vcpu *vcpu) { }
 
+static inline int kvmppc_xive_enabled(struct kvm_vcpu *vcpu)
+	{ return 0; }
+static inline int kvmppc_xive_native_connect_vcpu(struct kvm_device *dev,
+			  struct kvm_vcpu *vcpu, u32 cpu) { return -EBUSY; }
+static inline void kvmppc_xive_native_cleanup_vcpu(struct kvm_vcpu *vcpu) { }
 static inline void kvmppc_xive_native_init_module(void) { }
 static inline void kvmppc_xive_native_exit_module(void) { }
 
diff --git a/arch/powerpc/kvm/book3s_xive.h b/arch/powerpc/kvm/book3s_xive.h
index a08ae6fd4c51..d366df69b9cb 100644
--- a/arch/powerpc/kvm/book3s_xive.h
+++ b/arch/powerpc/kvm/book3s_xive.h
@@ -198,6 +198,11 @@ static inline struct kvmppc_xive_src_block *kvmppc_xive_find_source(struct kvmpp
 	return xive->src_blocks[bid];
 }
 
+static inline u32 kvmppc_xive_vp(struct kvmppc_xive *xive, u32 server)
+{
+	return xive->vp_base + kvmppc_pack_vcpu_id(xive->kvm, server);
+}
+
 /*
  * Mapping between guest priorities and host priorities
  * is as follow.
@@ -248,5 +253,11 @@ extern int (*__xive_vm_h_ipi)(struct kvm_vcpu *vcpu, unsigned long server,
 extern int (*__xive_vm_h_cppr)(struct kvm_vcpu *vcpu, unsigned long cppr);
 extern int (*__xive_vm_h_eoi)(struct kvm_vcpu *vcpu, unsigned long xirr);
 
+/*
+ * Common Xive routines for XICS-over-XIVE and XIVE native
+ */
+void kvmppc_xive_disable_vcpu_interrupts(struct kvm_vcpu *vcpu);
+int kvmppc_xive_debug_show_queues(struct seq_file *m, struct kvm_vcpu *vcpu);
+
 #endif /* CONFIG_KVM_XICS */
 #endif /* _KVM_PPC_BOOK3S_XICS_H */
diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h
index e6368163d3a0..52bf74a1616e 100644
--- a/include/uapi/linux/kvm.h
+++ b/include/uapi/linux/kvm.h
@@ -988,6 +988,7 @@ struct kvm_ppc_resize_hpt {
 #define KVM_CAP_ARM_VM_IPA_SIZE 165
 #define KVM_CAP_MANUAL_DIRTY_LOG_PROTECT 166
 #define KVM_CAP_HYPERV_CPUID 167
+#define KVM_CAP_PPC_IRQ_XIVE 168
 
 #ifdef KVM_CAP_IRQ_ROUTING
 
diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c
index f78d002f0fe0..e7f1ada1c3de 100644
--- a/arch/powerpc/kvm/book3s_xive.c
+++ b/arch/powerpc/kvm/book3s_xive.c
@@ -380,11 +380,6 @@ static int xive_select_target(struct kvm *kvm, u32 *server, u8 prio)
 	return -EBUSY;
 }
 
-static u32 xive_vp(struct kvmppc_xive *xive, u32 server)
-{
-	return xive->vp_base + kvmppc_pack_vcpu_id(xive->kvm, server);
-}
-
 static u8 xive_lock_and_mask(struct kvmppc_xive *xive,
 			     struct kvmppc_xive_src_block *sb,
 			     struct kvmppc_xive_irq_state *state)
@@ -430,8 +425,8 @@ static u8 xive_lock_and_mask(struct kvmppc_xive *xive,
 	 */
 	if (xd->flags & OPAL_XIVE_IRQ_MASK_VIA_FW) {
 		xive_native_configure_irq(hw_num,
-					  xive_vp(xive, state->act_server),
-					  MASKED, state->number);
+				kvmppc_xive_vp(xive, state->act_server),
+				MASKED, state->number);
 		/* set old_p so we can track if an H_EOI was done */
 		state->old_p = true;
 		state->old_q = false;
@@ -486,8 +481,8 @@ static void xive_finish_unmask(struct kvmppc_xive *xive,
 	 */
 	if (xd->flags & OPAL_XIVE_IRQ_MASK_VIA_FW) {
 		xive_native_configure_irq(hw_num,
-					  xive_vp(xive, state->act_server),
-					  state->act_priority, state->number);
+				kvmppc_xive_vp(xive, state->act_server),
+				state->act_priority, state->number);
 		/* If an EOI is needed, do it here */
 		if (!state->old_p)
 			xive_vm_source_eoi(hw_num, xd);
@@ -563,7 +558,7 @@ static int xive_target_interrupt(struct kvm *kvm,
 	kvmppc_xive_select_irq(state, &hw_num, NULL);
 
 	return xive_native_configure_irq(hw_num,
-					 xive_vp(xive, server),
+					 kvmppc_xive_vp(xive, server),
 					 prio, state->number);
 }
 
@@ -951,7 +946,7 @@ int kvmppc_xive_set_mapped(struct kvm *kvm, unsigned long guest_irq,
 	 * which is fine for a never started interrupt.
 	 */
 	xive_native_configure_irq(hw_irq,
-				  xive_vp(xive, state->act_server),
+				  kvmppc_xive_vp(xive, state->act_server),
 				  state->act_priority, state->number);
 
 	/*
@@ -1027,7 +1022,7 @@ int kvmppc_xive_clr_mapped(struct kvm *kvm, unsigned long guest_irq,
 
 	/* Reconfigure the IPI */
 	xive_native_configure_irq(state->ipi_number,
-				  xive_vp(xive, state->act_server),
+				  kvmppc_xive_vp(xive, state->act_server),
 				  state->act_priority, state->number);
 
 	/*
@@ -1049,7 +1044,7 @@ int kvmppc_xive_clr_mapped(struct kvm *kvm, unsigned long guest_irq,
 }
 EXPORT_SYMBOL_GPL(kvmppc_xive_clr_mapped);
 
-static void kvmppc_xive_disable_vcpu_interrupts(struct kvm_vcpu *vcpu)
+void kvmppc_xive_disable_vcpu_interrupts(struct kvm_vcpu *vcpu)
 {
 	struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
 	struct kvm *kvm = vcpu->kvm;
@@ -1166,7 +1161,7 @@ int kvmppc_xive_connect_vcpu(struct kvm_device *dev,
 	xc->xive = xive;
 	xc->vcpu = vcpu;
 	xc->server_num = cpu;
-	xc->vp_id = xive_vp(xive, cpu);
+	xc->vp_id = kvmppc_xive_vp(xive, cpu);
 	xc->mfrr = 0xff;
 	xc->valid = true;
 
@@ -1883,6 +1878,43 @@ static int kvmppc_xive_create(struct kvm_device *dev, u32 type)
 	return 0;
 }
 
+int kvmppc_xive_debug_show_queues(struct seq_file *m, struct kvm_vcpu *vcpu)
+{
+	struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
+	unsigned int i;
+
+	for (i = 0; i < KVMPPC_XIVE_Q_COUNT; i++) {
+		struct xive_q *q = &xc->queues[i];
+		u32 i0, i1, idx;
+
+		if (!q->qpage && !xc->esc_virq[i])
+			continue;
+
+		seq_printf(m, " [q%d]: ", i);
+
+		if (q->qpage) {
+			idx = q->idx;
+			i0 = be32_to_cpup(q->qpage + idx);
+			idx = (idx + 1) & q->msk;
+			i1 = be32_to_cpup(q->qpage + idx);
+			seq_printf(m, "T=%d %08x %08x...\n", q->toggle,
+				   i0, i1);
+		}
+		if (xc->esc_virq[i]) {
+			struct irq_data *d = irq_get_irq_data(xc->esc_virq[i]);
+			struct xive_irq_data *xd =
+				irq_data_get_irq_handler_data(d);
+			u64 pq = xive_vm_esb_load(xd, XIVE_ESB_GET);
+
+			seq_printf(m, "E:%c%c I(%d:%llx:%llx)",
+				   (pq & XIVE_ESB_VAL_P) ? 'P' : 'p',
+				   (pq & XIVE_ESB_VAL_Q) ? 'Q' : 'q',
+				   xc->esc_virq[i], pq, xd->eoi_page);
+			seq_puts(m, "\n");
+		}
+	}
+	return 0;
+}
 
 static int xive_debug_show(struct seq_file *m, void *private)
 {
@@ -1908,7 +1940,6 @@ static int xive_debug_show(struct seq_file *m, void *private)
 
 	kvm_for_each_vcpu(i, vcpu, kvm) {
 		struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
-		unsigned int i;
 
 		if (!xc)
 			continue;
@@ -1918,33 +1949,8 @@ static int xive_debug_show(struct seq_file *m, void *private)
 			   xc->server_num, xc->cppr, xc->hw_cppr,
 			   xc->mfrr, xc->pending,
 			   xc->stat_rm_h_xirr, xc->stat_vm_h_xirr);
-		for (i = 0; i < KVMPPC_XIVE_Q_COUNT; i++) {
-			struct xive_q *q = &xc->queues[i];
-			u32 i0, i1, idx;
 
-			if (!q->qpage && !xc->esc_virq[i])
-				continue;
-
-			seq_printf(m, " [q%d]: ", i);
-
-			if (q->qpage) {
-				idx = q->idx;
-				i0 = be32_to_cpup(q->qpage + idx);
-				idx = (idx + 1) & q->msk;
-				i1 = be32_to_cpup(q->qpage + idx);
-				seq_printf(m, "T=%d %08x %08x... \n", q->toggle, i0, i1);
-			}
-			if (xc->esc_virq[i]) {
-				struct irq_data *d = irq_get_irq_data(xc->esc_virq[i]);
-				struct xive_irq_data *xd = irq_data_get_irq_handler_data(d);
-				u64 pq = xive_vm_esb_load(xd, XIVE_ESB_GET);
-				seq_printf(m, "E:%c%c I(%d:%llx:%llx)",
-					   (pq & XIVE_ESB_VAL_P) ? 'P' : 'p',
-					   (pq & XIVE_ESB_VAL_Q) ? 'Q' : 'q',
-					   xc->esc_virq[i], pq, xd->eoi_page);
-				seq_printf(m, "\n");
-			}
-		}
+		kvmppc_xive_debug_show_queues(m, vcpu);
 
 		t_rm_h_xirr += xc->stat_rm_h_xirr;
 		t_rm_h_ipoll += xc->stat_rm_h_ipoll;
diff --git a/arch/powerpc/kvm/book3s_xive_native.c b/arch/powerpc/kvm/book3s_xive_native.c
index 751259394150..6fa73cfd9d9c 100644
--- a/arch/powerpc/kvm/book3s_xive_native.c
+++ b/arch/powerpc/kvm/book3s_xive_native.c
@@ -26,6 +26,134 @@
 
 #include "book3s_xive.h"
 
+static void kvmppc_xive_native_cleanup_queue(struct kvm_vcpu *vcpu, int prio)
+{
+	struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
+	struct xive_q *q = &xc->queues[prio];
+
+	xive_native_disable_queue(xc->vp_id, q, prio);
+	if (q->qpage) {
+		put_page(virt_to_page(q->qpage));
+		q->qpage = NULL;
+	}
+}
+
+void kvmppc_xive_native_cleanup_vcpu(struct kvm_vcpu *vcpu)
+{
+	struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
+	int i;
+
+	if (!kvmppc_xive_enabled(vcpu))
+		return;
+
+	if (!xc)
+		return;
+
+	pr_devel("native_cleanup_vcpu(cpu=%d)\n", xc->server_num);
+
+	/* Ensure no interrupt is still routed to that VP */
+	xc->valid = false;
+	kvmppc_xive_disable_vcpu_interrupts(vcpu);
+
+	/* Disable the VP */
+	xive_native_disable_vp(xc->vp_id);
+
+	/* Free the queues & associated interrupts */
+	for (i = 0; i < KVMPPC_XIVE_Q_COUNT; i++) {
+		/* Free the escalation irq */
+		if (xc->esc_virq[i]) {
+			free_irq(xc->esc_virq[i], vcpu);
+			irq_dispose_mapping(xc->esc_virq[i]);
+			kfree(xc->esc_virq_names[i]);
+			xc->esc_virq[i] = 0;
+		}
+
+		/* Free the queue */
+		kvmppc_xive_native_cleanup_queue(vcpu, i);
+	}
+
+	/* Free the VP */
+	kfree(xc);
+
+	/* Cleanup the vcpu */
+	vcpu->arch.irq_type = KVMPPC_IRQ_DEFAULT;
+	vcpu->arch.xive_vcpu = NULL;
+}
+
+int kvmppc_xive_native_connect_vcpu(struct kvm_device *dev,
+				    struct kvm_vcpu *vcpu, u32 server_num)
+{
+	struct kvmppc_xive *xive = dev->private;
+	struct kvmppc_xive_vcpu *xc = NULL;
+	int rc;
+
+	pr_devel("native_connect_vcpu(server=%d)\n", server_num);
+
+	if (dev->ops != &kvm_xive_native_ops) {
+		pr_devel("Wrong ops !\n");
+		return -EPERM;
+	}
+	if (xive->kvm != vcpu->kvm)
+		return -EPERM;
+	if (vcpu->arch.irq_type != KVMPPC_IRQ_DEFAULT)
+		return -EBUSY;
+	if (server_num >= KVM_MAX_VCPUS) {
+		pr_devel("Out of bounds !\n");
+		return -EINVAL;
+	}
+
+	mutex_lock(&vcpu->kvm->lock);
+
+	if (kvmppc_xive_find_server(vcpu->kvm, server_num)) {
+		pr_devel("Duplicate !\n");
+		rc = -EEXIST;
+		goto bail;
+	}
+
+	xc = kzalloc(sizeof(*xc), GFP_KERNEL);
+	if (!xc) {
+		rc = -ENOMEM;
+		goto bail;
+	}
+
+	vcpu->arch.xive_vcpu = xc;
+	xc->xive = xive;
+	xc->vcpu = vcpu;
+	xc->server_num = server_num;
+
+	xc->vp_id = kvmppc_xive_vp(xive, server_num);
+	xc->valid = true;
+	vcpu->arch.irq_type = KVMPPC_IRQ_XIVE;
+
+	rc = xive_native_get_vp_info(xc->vp_id, &xc->vp_cam, &xc->vp_chip_id);
+	if (rc) {
+		pr_err("Failed to get VP info from OPAL: %d\n", rc);
+		goto bail;
+	}
+
+	/*
+	 * Enable the VP first as the single escalation mode will
+	 * affect escalation interrupts numbering
+	 */
+	rc = xive_native_enable_vp(xc->vp_id, xive->single_escalation);
+	if (rc) {
+		pr_err("Failed to enable VP in OPAL: %d\n", rc);
+		goto bail;
+	}
+
+	/* Configure VCPU fields for use by assembly push/pull */
+	vcpu->arch.xive_saved_state.w01 = cpu_to_be64(0xff000000);
+	vcpu->arch.xive_cam_word = cpu_to_be32(xc->vp_cam | TM_QW1W2_VO);
+
+	/* TODO: reset all queues to a clean state ? */
+bail:
+	mutex_unlock(&vcpu->kvm->lock);
+	if (rc)
+		kvmppc_xive_native_cleanup_vcpu(vcpu);
+
+	return rc;
+}
+
 static int kvmppc_xive_native_set_attr(struct kvm_device *dev,
 				       struct kvm_device_attr *attr)
 {
@@ -114,10 +242,32 @@ static int xive_native_debug_show(struct seq_file *m, void *private)
 {
 	struct kvmppc_xive *xive = m->private;
 	struct kvm *kvm = xive->kvm;
+	struct kvm_vcpu *vcpu;
+	unsigned int i;
 
 	if (!kvm)
 		return 0;
 
+	seq_puts(m, "=========\nVCPU state\n=========\n");
+
+	kvm_for_each_vcpu(i, vcpu, kvm) {
+		struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
+
+		if (!xc)
+			continue;
+
+		seq_printf(m, "cpu server %#x NSR=%02x CPPR=%02x IBP=%02x PIPR=%02x w01=%016llx w2=%08x\n",
+			   xc->server_num,
+			   vcpu->arch.xive_saved_state.nsr,
+			   vcpu->arch.xive_saved_state.cppr,
+			   vcpu->arch.xive_saved_state.ipb,
+			   vcpu->arch.xive_saved_state.pipr,
+			   vcpu->arch.xive_saved_state.w01,
+			   (u32) vcpu->arch.xive_cam_word);
+
+		kvmppc_xive_debug_show_queues(m, vcpu);
+	}
+
 	return 0;
 }
 
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index 8885377ec3e0..b0858ee61460 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -570,6 +570,15 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
 	case KVM_CAP_PPC_GET_CPU_CHAR:
 		r = 1;
 		break;
+#ifdef CONFIG_KVM_XIVE
+	case KVM_CAP_PPC_IRQ_XIVE:
+		/*
+		 * Return false until all the XIVE infrastructure is
+		 * in place including support for migration.
+		 */
+		r = 0;
+		break;
+#endif
 
 	case KVM_CAP_PPC_ALLOC_HTAB:
 		r = hv_enabled;
@@ -753,6 +762,9 @@ void kvm_arch_vcpu_free(struct kvm_vcpu *vcpu)
 		else
 			kvmppc_xics_free_icp(vcpu);
 		break;
+	case KVMPPC_IRQ_XIVE:
+		kvmppc_xive_native_cleanup_vcpu(vcpu);
+		break;
 	}
 
 	kvmppc_core_vcpu_free(vcpu);
@@ -1941,6 +1953,30 @@ static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu *vcpu,
 		break;
 	}
 #endif /* CONFIG_KVM_XICS */
+#ifdef CONFIG_KVM_XIVE
+	case KVM_CAP_PPC_IRQ_XIVE: {
+		struct fd f;
+		struct kvm_device *dev;
+
+		r = -EBADF;
+		f = fdget(cap->args[0]);
+		if (!f.file)
+			break;
+
+		r = -ENXIO;
+		if (!xive_enabled())
+			break;
+
+		r = -EPERM;
+		dev = kvm_device_from_filp(f.file);
+		if (dev)
+			r = kvmppc_xive_native_connect_vcpu(dev, vcpu,
+							    cap->args[1]);
+
+		fdput(f);
+		break;
+	}
+#endif /* CONFIG_KVM_XIVE */
 #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
 	case KVM_CAP_PPC_FWNMI:
 		r = -EINVAL;
diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt
index 67068c47c591..e38eb17b7be6 100644
--- a/Documentation/virtual/kvm/api.txt
+++ b/Documentation/virtual/kvm/api.txt
@@ -4504,6 +4504,15 @@ struct kvm_sync_regs {
         struct kvm_vcpu_events events;
 };
 
+6.75 KVM_CAP_PPC_IRQ_XIVE
+
+Architectures: ppc
+Target: vcpu
+Parameters: args[0] is the XIVE device fd
+            args[1] is the XIVE CPU number (server ID) for this vcpu
+
+This capability connects the vcpu to an in-kernel XIVE device.
+
 7. Capabilities that can be enabled on VMs
 ------------------------------------------
 
-- 
2.20.1


^ permalink raw reply related

* [PATCH v5 01/16] powerpc/xive: add OPAL extensions for the XIVE native exploitation support
From: Cédric Le Goater @ 2019-04-10 17:04 UTC (permalink / raw)
  To: kvm-ppc
  Cc: kvm, Paul Mackerras, Cédric Le Goater, linuxppc-dev,
	David Gibson
In-Reply-To: <20190410170448.3923-1-clg@kaod.org>

The support for XIVE native exploitation mode in Linux/KVM needs a
couple more OPAL calls to get and set the state of the XIVE internal
structures being used by a sPAPR guest.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
---
 arch/powerpc/include/asm/opal-api.h        |  7 +-
 arch/powerpc/include/asm/opal.h            |  7 ++
 arch/powerpc/include/asm/xive.h            | 14 +++
 arch/powerpc/platforms/powernv/opal-call.c |  3 +
 arch/powerpc/sysdev/xive/native.c          | 99 ++++++++++++++++++++++
 5 files changed, 127 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/include/asm/opal-api.h b/arch/powerpc/include/asm/opal-api.h
index 870fb7b239ea..e1d118ac61dc 100644
--- a/arch/powerpc/include/asm/opal-api.h
+++ b/arch/powerpc/include/asm/opal-api.h
@@ -186,8 +186,8 @@
 #define OPAL_XIVE_FREE_IRQ			140
 #define OPAL_XIVE_SYNC				141
 #define OPAL_XIVE_DUMP				142
-#define OPAL_XIVE_RESERVED3			143
-#define OPAL_XIVE_RESERVED4			144
+#define OPAL_XIVE_GET_QUEUE_STATE		143
+#define OPAL_XIVE_SET_QUEUE_STATE		144
 #define OPAL_SIGNAL_SYSTEM_RESET		145
 #define OPAL_NPU_INIT_CONTEXT			146
 #define OPAL_NPU_DESTROY_CONTEXT		147
@@ -210,7 +210,8 @@
 #define OPAL_PCI_GET_PBCQ_TUNNEL_BAR		164
 #define OPAL_PCI_SET_PBCQ_TUNNEL_BAR		165
 #define	OPAL_NX_COPROC_INIT			167
-#define OPAL_LAST				167
+#define OPAL_XIVE_GET_VP_STATE			170
+#define OPAL_LAST				170
 
 #define QUIESCE_HOLD			1 /* Spin all calls at entry */
 #define QUIESCE_REJECT			2 /* Fail all calls with OPAL_BUSY */
diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h
index a55b01c90bb1..4e978d4dea5c 100644
--- a/arch/powerpc/include/asm/opal.h
+++ b/arch/powerpc/include/asm/opal.h
@@ -279,6 +279,13 @@ int64_t opal_xive_allocate_irq(uint32_t chip_id);
 int64_t opal_xive_free_irq(uint32_t girq);
 int64_t opal_xive_sync(uint32_t type, uint32_t id);
 int64_t opal_xive_dump(uint32_t type, uint32_t id);
+int64_t opal_xive_get_queue_state(uint64_t vp, uint32_t prio,
+				  __be32 *out_qtoggle,
+				  __be32 *out_qindex);
+int64_t opal_xive_set_queue_state(uint64_t vp, uint32_t prio,
+				  uint32_t qtoggle,
+				  uint32_t qindex);
+int64_t opal_xive_get_vp_state(uint64_t vp, __be64 *out_w01);
 int64_t opal_pci_set_p2p(uint64_t phb_init, uint64_t phb_target,
 			uint64_t desc, uint16_t pe_number);
 
diff --git a/arch/powerpc/include/asm/xive.h b/arch/powerpc/include/asm/xive.h
index 3c704f5dd3ae..b579a943407b 100644
--- a/arch/powerpc/include/asm/xive.h
+++ b/arch/powerpc/include/asm/xive.h
@@ -109,12 +109,26 @@ extern int xive_native_configure_queue(u32 vp_id, struct xive_q *q, u8 prio,
 extern void xive_native_disable_queue(u32 vp_id, struct xive_q *q, u8 prio);
 
 extern void xive_native_sync_source(u32 hw_irq);
+extern void xive_native_sync_queue(u32 hw_irq);
 extern bool is_xive_irq(struct irq_chip *chip);
 extern int xive_native_enable_vp(u32 vp_id, bool single_escalation);
 extern int xive_native_disable_vp(u32 vp_id);
 extern int xive_native_get_vp_info(u32 vp_id, u32 *out_cam_id, u32 *out_chip_id);
 extern bool xive_native_has_single_escalation(void);
 
+extern int xive_native_get_queue_info(u32 vp_id, uint32_t prio,
+				      u64 *out_qpage,
+				      u64 *out_qsize,
+				      u64 *out_qeoi_page,
+				      u32 *out_escalate_irq,
+				      u64 *out_qflags);
+
+extern int xive_native_get_queue_state(u32 vp_id, uint32_t prio, u32 *qtoggle,
+				       u32 *qindex);
+extern int xive_native_set_queue_state(u32 vp_id, uint32_t prio, u32 qtoggle,
+				       u32 qindex);
+extern int xive_native_get_vp_state(u32 vp_id, u64 *out_state);
+
 #else
 
 static inline bool xive_enabled(void) { return false; }
diff --git a/arch/powerpc/platforms/powernv/opal-call.c b/arch/powerpc/platforms/powernv/opal-call.c
index daad8c45c8e7..7472244e7f30 100644
--- a/arch/powerpc/platforms/powernv/opal-call.c
+++ b/arch/powerpc/platforms/powernv/opal-call.c
@@ -260,6 +260,9 @@ OPAL_CALL(opal_xive_get_vp_info,		OPAL_XIVE_GET_VP_INFO);
 OPAL_CALL(opal_xive_set_vp_info,		OPAL_XIVE_SET_VP_INFO);
 OPAL_CALL(opal_xive_sync,			OPAL_XIVE_SYNC);
 OPAL_CALL(opal_xive_dump,			OPAL_XIVE_DUMP);
+OPAL_CALL(opal_xive_get_queue_state,		OPAL_XIVE_GET_QUEUE_STATE);
+OPAL_CALL(opal_xive_set_queue_state,		OPAL_XIVE_SET_QUEUE_STATE);
+OPAL_CALL(opal_xive_get_vp_state,		OPAL_XIVE_GET_VP_STATE);
 OPAL_CALL(opal_signal_system_reset,		OPAL_SIGNAL_SYSTEM_RESET);
 OPAL_CALL(opal_npu_init_context,		OPAL_NPU_INIT_CONTEXT);
 OPAL_CALL(opal_npu_destroy_context,		OPAL_NPU_DESTROY_CONTEXT);
diff --git a/arch/powerpc/sysdev/xive/native.c b/arch/powerpc/sysdev/xive/native.c
index 1ca127d052a6..0c037e933e55 100644
--- a/arch/powerpc/sysdev/xive/native.c
+++ b/arch/powerpc/sysdev/xive/native.c
@@ -437,6 +437,12 @@ void xive_native_sync_source(u32 hw_irq)
 }
 EXPORT_SYMBOL_GPL(xive_native_sync_source);
 
+void xive_native_sync_queue(u32 hw_irq)
+{
+	opal_xive_sync(XIVE_SYNC_QUEUE, hw_irq);
+}
+EXPORT_SYMBOL_GPL(xive_native_sync_queue);
+
 static const struct xive_ops xive_native_ops = {
 	.populate_irq_data	= xive_native_populate_irq_data,
 	.configure_irq		= xive_native_configure_irq,
@@ -711,3 +717,96 @@ bool xive_native_has_single_escalation(void)
 	return xive_has_single_esc;
 }
 EXPORT_SYMBOL_GPL(xive_native_has_single_escalation);
+
+int xive_native_get_queue_info(u32 vp_id, u32 prio,
+			       u64 *out_qpage,
+			       u64 *out_qsize,
+			       u64 *out_qeoi_page,
+			       u32 *out_escalate_irq,
+			       u64 *out_qflags)
+{
+	__be64 qpage;
+	__be64 qsize;
+	__be64 qeoi_page;
+	__be32 escalate_irq;
+	__be64 qflags;
+	s64 rc;
+
+	rc = opal_xive_get_queue_info(vp_id, prio, &qpage, &qsize,
+				      &qeoi_page, &escalate_irq, &qflags);
+	if (rc) {
+		pr_err("OPAL failed to get queue info for VCPU %d/%d : %lld\n",
+		       vp_id, prio, rc);
+		return -EIO;
+	}
+
+	if (out_qpage)
+		*out_qpage = be64_to_cpu(qpage);
+	if (out_qsize)
+		*out_qsize = be32_to_cpu(qsize);
+	if (out_qeoi_page)
+		*out_qeoi_page = be64_to_cpu(qeoi_page);
+	if (out_escalate_irq)
+		*out_escalate_irq = be32_to_cpu(escalate_irq);
+	if (out_qflags)
+		*out_qflags = be64_to_cpu(qflags);
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(xive_native_get_queue_info);
+
+int xive_native_get_queue_state(u32 vp_id, u32 prio, u32 *qtoggle, u32 *qindex)
+{
+	__be32 opal_qtoggle;
+	__be32 opal_qindex;
+	s64 rc;
+
+	rc = opal_xive_get_queue_state(vp_id, prio, &opal_qtoggle,
+				       &opal_qindex);
+	if (rc) {
+		pr_err("OPAL failed to get queue state for VCPU %d/%d : %lld\n",
+		       vp_id, prio, rc);
+		return -EIO;
+	}
+
+	if (qtoggle)
+		*qtoggle = be32_to_cpu(opal_qtoggle);
+	if (qindex)
+		*qindex = be32_to_cpu(opal_qindex);
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(xive_native_get_queue_state);
+
+int xive_native_set_queue_state(u32 vp_id, u32 prio, u32 qtoggle, u32 qindex)
+{
+	s64 rc;
+
+	rc = opal_xive_set_queue_state(vp_id, prio, qtoggle, qindex);
+	if (rc) {
+		pr_err("OPAL failed to set queue state for VCPU %d/%d : %lld\n",
+		       vp_id, prio, rc);
+		return -EIO;
+	}
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(xive_native_set_queue_state);
+
+int xive_native_get_vp_state(u32 vp_id, u64 *out_state)
+{
+	__be64 state;
+	s64 rc;
+
+	rc = opal_xive_get_vp_state(vp_id, &state);
+	if (rc) {
+		pr_err("OPAL failed to get vp state for VCPU %d : %lld\n",
+		       vp_id, rc);
+		return -EIO;
+	}
+
+	if (out_state)
+		*out_state = be64_to_cpu(state);
+	return 0;
+}
+EXPORT_SYMBOL_GPL(xive_native_get_vp_state);
-- 
2.20.1


^ permalink raw reply related

* Re: [PATCH-tip 00/22] locking/rwsem: Rework rwsem-xadd & enable new rwsem features
From: Waiman Long @ 2019-04-10 16:08 UTC (permalink / raw)
  To: huang ying
  Cc: linux-ia64, Linux-sh list, Peter Zijlstra, Will Deacon,
	H. Peter Anvin, sparclinux, linux-arch, Davidlohr Bueso,
	Chen Rong, linux-hexagon, the arch/x86 maintainers,
	IngoMolnar@shao2-debian, linux-xtensa, Arnd Bergmann,
	linuxppc-dev, Borislav Petkov, Thomas Gleixner,
	linux-alpha@vger.kernel.org, Linus Torvalds,
	Linux List Kernel Mailing, Andrew Morton, Tim Chen
In-Reply-To: <CAC=cRTM5=e7rJX80m0vL10aQoLawK_VTnQubH8A7_sUO2VUCNA@mail.gmail.com>

On 04/10/2019 04:15 AM, huang ying wrote:
> Hi, Waiman,
>
> What's the status of this patchset?  And its merging plan?
>
> Best Regards,
> Huang, Ying

I have broken the patch into 3 parts (0/1/2) and rewritten some of them.
Part 0 has been merged into tip. Parts 1 and 2 are still under testing.

Cheers,
Longman


^ permalink raw reply

* Re: [PATCH 21/21] docs: hwmon: Add an index file and rename docs to *.rst
From: Jonathan Neuschäfer @ 2019-04-10 15:24 UTC (permalink / raw)
  To: Mauro Carvalho Chehab
  Cc: Mark Rutland, Dirk Eibach, linux-aspeed, Linux Doc Mailing List,
	Clemens Ladisch, Kamil Debski, Marc Hulsman, devicetree,
	Huang Rui, Paul Mackerras, Jim Cromie, Lorenzo Pieralisi,
	Jonathan Corbet, Joel Stanley, Guenter Roeck, Steve Glendinning,
	Fenghua Yu, Jean Delvare, Bartlomiej Zolnierkiewicz, Liviu Dudau,
	Mauro Carvalho Chehab, Hans de Goede, Rob Herring, Rudolf Marek,
	linux-arm-kernel, linux-hwmon, Support Opensource, George Joseph,
	Andreas Werner, Andrew Jeffery, patches, linux-kernel,
	Juerg Haefliger, Sudeep Holla, linuxppc-dev
In-Reply-To: <5ac1fbc7f19192dcd30a184e62e3f7989a5437a4.1554893882.git.mchehab+samsung@kernel.org>

[-- Attachment #1: Type: text/plain, Size: 1648 bytes --]

Hello,

On Wed, Apr 10, 2019 at 08:12:11AM -0300, Mauro Carvalho Chehab wrote:
> Now that all files were converted to ReST format, rename them
> and add an index.
> 
> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
> ---
[...]
> diff --git a/Documentation/hwmon/submitting-patches b/Documentation/hwmon/submitting-patches.rst
> similarity index 99%
> rename from Documentation/hwmon/submitting-patches
> rename to Documentation/hwmon/submitting-patches.rst
> index 12540b7d9b50..6120db7556aa 100644
> --- a/Documentation/hwmon/submitting-patches
> +++ b/Documentation/hwmon/submitting-patches.rst

I'd additionally suggest:

diff --git a/Documentation/hwmon/submitting-patches b/Documentation/hwmon/submitting-patches.rst
index f88221b46153..0000a86be4b9 100644
--- a/Documentation/hwmon/submitting-patches
+++ b/Documentation/hwmon/submitting-patches.rst
@@ -38,7 +38,7 @@ increase the chances of your change being accepted.
 2. Adding functionality to existing drivers
 -------------------------------------------
 
-* Make sure the documentation in Documentation/hwmon/<driver_name> is up to
+* Make sure the documentation in Documentation/hwmon/<driver_name>.rst is up to
   date.
 
 * Make sure the information in Kconfig is up to date.
@@ -60,7 +60,7 @@ increase the chances of your change being accepted.
 
 * Consider adding yourself to MAINTAINERS.
 
-* Document the driver in Documentation/hwmon/<driver_name>.
+* Document the driver in Documentation/hwmon/<driver_name>.rst.
 
 * Add the driver to Kconfig and Makefile in alphabetical order.
 

Thanks,
Jonathan Neuschäfer

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply related


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox