diff options
| -rw-r--r-- | drivers/char/hw_random/intel-rng.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/drivers/char/hw_random/intel-rng.c b/drivers/char/hw_random/intel-rng.c index 8efbc9c0e545..154ce3e6b3c9 100644 --- a/drivers/char/hw_random/intel-rng.c +++ b/drivers/char/hw_random/intel-rng.c | |||
| @@ -143,6 +143,11 @@ static const struct pci_device_id pci_tbl[] = { | |||
| 143 | }; | 143 | }; |
| 144 | MODULE_DEVICE_TABLE(pci, pci_tbl); | 144 | MODULE_DEVICE_TABLE(pci, pci_tbl); |
| 145 | 145 | ||
| 146 | static __initdata int no_fwh_detect; | ||
| 147 | module_param(no_fwh_detect, int, 0); | ||
| 148 | MODULE_PARM_DESC(no_fwh_detect, "Skip FWH detection:\n" | ||
| 149 | " positive value - skip if FWH space locked read-only\n" | ||
| 150 | " negative value - skip always"); | ||
| 146 | 151 | ||
| 147 | static inline u8 hwstatus_get(void __iomem *mem) | 152 | static inline u8 hwstatus_get(void __iomem *mem) |
| 148 | { | 153 | { |
| @@ -240,6 +245,11 @@ static int __init mod_init(void) | |||
| 240 | if (!dev) | 245 | if (!dev) |
| 241 | goto out; /* Device not found. */ | 246 | goto out; /* Device not found. */ |
| 242 | 247 | ||
| 248 | if (no_fwh_detect < 0) { | ||
| 249 | pci_dev_put(dev); | ||
| 250 | goto fwh_done; | ||
| 251 | } | ||
| 252 | |||
| 243 | /* Check for Intel 82802 */ | 253 | /* Check for Intel 82802 */ |
| 244 | if (dev->device < 0x2640) { | 254 | if (dev->device < 0x2640) { |
| 245 | fwh_dec_en1_off = FWH_DEC_EN1_REG_OLD; | 255 | fwh_dec_en1_off = FWH_DEC_EN1_REG_OLD; |
| @@ -252,6 +262,23 @@ static int __init mod_init(void) | |||
| 252 | pci_read_config_byte(dev, fwh_dec_en1_off, &fwh_dec_en1_val); | 262 | pci_read_config_byte(dev, fwh_dec_en1_off, &fwh_dec_en1_val); |
| 253 | pci_read_config_byte(dev, bios_cntl_off, &bios_cntl_val); | 263 | pci_read_config_byte(dev, bios_cntl_off, &bios_cntl_val); |
| 254 | 264 | ||
| 265 | if ((bios_cntl_val & | ||
| 266 | (BIOS_CNTL_LOCK_ENABLE_MASK|BIOS_CNTL_WRITE_ENABLE_MASK)) | ||
| 267 | == BIOS_CNTL_LOCK_ENABLE_MASK) { | ||
| 268 | static __initdata /*const*/ char warning[] = | ||
| 269 | KERN_WARNING PFX "Firmware space is locked read-only. If you can't or\n" | ||
| 270 | KERN_WARNING PFX "don't want to disable this in firmware setup, and if\n" | ||
| 271 | KERN_WARNING PFX "you are certain that your system has a functional\n" | ||
| 272 | KERN_WARNING PFX "RNG, try using the 'no_fwh_detect' option.\n"; | ||
| 273 | |||
| 274 | pci_dev_put(dev); | ||
| 275 | if (no_fwh_detect) | ||
| 276 | goto fwh_done; | ||
| 277 | printk(warning); | ||
| 278 | err = -EBUSY; | ||
| 279 | goto out; | ||
| 280 | } | ||
| 281 | |||
| 255 | mem = ioremap_nocache(INTEL_FWH_ADDR, INTEL_FWH_ADDR_LEN); | 282 | mem = ioremap_nocache(INTEL_FWH_ADDR, INTEL_FWH_ADDR_LEN); |
| 256 | if (mem == NULL) { | 283 | if (mem == NULL) { |
| 257 | pci_dev_put(dev); | 284 | pci_dev_put(dev); |
| @@ -280,8 +307,7 @@ static int __init mod_init(void) | |||
| 280 | pci_write_config_byte(dev, | 307 | pci_write_config_byte(dev, |
| 281 | fwh_dec_en1_off, | 308 | fwh_dec_en1_off, |
| 282 | fwh_dec_en1_val | FWH_F8_EN_MASK); | 309 | fwh_dec_en1_val | FWH_F8_EN_MASK); |
| 283 | if (!(bios_cntl_val & | 310 | if (!(bios_cntl_val & BIOS_CNTL_WRITE_ENABLE_MASK)) |
| 284 | (BIOS_CNTL_LOCK_ENABLE_MASK|BIOS_CNTL_WRITE_ENABLE_MASK))) | ||
| 285 | pci_write_config_byte(dev, | 311 | pci_write_config_byte(dev, |
| 286 | bios_cntl_off, | 312 | bios_cntl_off, |
| 287 | bios_cntl_val | BIOS_CNTL_WRITE_ENABLE_MASK); | 313 | bios_cntl_val | BIOS_CNTL_WRITE_ENABLE_MASK); |
| @@ -315,6 +341,8 @@ static int __init mod_init(void) | |||
| 315 | goto out; | 341 | goto out; |
| 316 | } | 342 | } |
| 317 | 343 | ||
| 344 | fwh_done: | ||
| 345 | |||
| 318 | err = -ENOMEM; | 346 | err = -ENOMEM; |
| 319 | mem = ioremap(INTEL_RNG_ADDR, INTEL_RNG_ADDR_LEN); | 347 | mem = ioremap(INTEL_RNG_ADDR, INTEL_RNG_ADDR_LEN); |
| 320 | if (!mem) | 348 | if (!mem) |
