|
|
|
@ -1,5 +1,5 @@
|
|
|
|
|
/*
|
|
|
|
|
* Copyright (C) 2010 OKI SEMICONDUCTOR CO., LTD.
|
|
|
|
|
* Copyright (C) 2011 LAPIS Semiconductor Co., Ltd.
|
|
|
|
|
*
|
|
|
|
|
* 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
|
|
|
|
@ -41,10 +41,10 @@
|
|
|
|
|
#define PCH_PHUB_ROM_START_ADDR_EG20T 0x80 /* ROM data area start address offset
|
|
|
|
|
(Intel EG20T PCH)*/
|
|
|
|
|
#define PCH_PHUB_ROM_START_ADDR_ML7213 0x400 /* ROM data area start address
|
|
|
|
|
offset(OKI SEMICONDUCTOR ML7213)
|
|
|
|
|
offset(LAPIS Semicon ML7213)
|
|
|
|
|
*/
|
|
|
|
|
#define PCH_PHUB_ROM_START_ADDR_ML7223 0x400 /* ROM data area start address
|
|
|
|
|
offset(OKI SEMICONDUCTOR ML7223)
|
|
|
|
|
offset(LAPIS Semicon ML7223)
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/* MAX number of INT_REDUCE_CONTROL registers */
|
|
|
|
@ -73,6 +73,9 @@
|
|
|
|
|
#define PCI_DEVICE_ID_ROHM_ML7223_mPHUB 0x8012 /* for Bus-m */
|
|
|
|
|
#define PCI_DEVICE_ID_ROHM_ML7223_nPHUB 0x8002 /* for Bus-n */
|
|
|
|
|
|
|
|
|
|
/* Macros for ML7831 */
|
|
|
|
|
#define PCI_DEVICE_ID_ROHM_ML7831_PHUB 0x8801
|
|
|
|
|
|
|
|
|
|
/* SROM ACCESS Macro */
|
|
|
|
|
#define PCH_WORD_ADDR_MASK (~((1 << 2) - 1))
|
|
|
|
|
|
|
|
|
@ -115,6 +118,7 @@
|
|
|
|
|
* @pch_mac_start_address: MAC address area start address
|
|
|
|
|
* @pch_opt_rom_start_address: Option ROM start address
|
|
|
|
|
* @ioh_type: Save IOH type
|
|
|
|
|
* @pdev: pointer to pci device struct
|
|
|
|
|
*/
|
|
|
|
|
struct pch_phub_reg {
|
|
|
|
|
u32 phub_id_reg;
|
|
|
|
@ -136,6 +140,7 @@ struct pch_phub_reg {
|
|
|
|
|
u32 pch_mac_start_address;
|
|
|
|
|
u32 pch_opt_rom_start_address;
|
|
|
|
|
int ioh_type;
|
|
|
|
|
struct pci_dev *pdev;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* SROM SPEC for MAC address assignment offset */
|
|
|
|
@ -471,7 +476,7 @@ static int pch_phub_write_gbe_mac_addr(struct pch_phub_reg *chip, u8 *data)
|
|
|
|
|
int retval;
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
if (chip->ioh_type == 1) /* EG20T */
|
|
|
|
|
if ((chip->ioh_type == 1) || (chip->ioh_type == 5)) /* EG20T or ML7831*/
|
|
|
|
|
retval = pch_phub_gbe_serial_rom_conf(chip);
|
|
|
|
|
else /* ML7223 */
|
|
|
|
|
retval = pch_phub_gbe_serial_rom_conf_mp(chip);
|
|
|
|
@ -498,6 +503,7 @@ static ssize_t pch_phub_bin_read(struct file *filp, struct kobject *kobj,
|
|
|
|
|
unsigned int orom_size;
|
|
|
|
|
int ret;
|
|
|
|
|
int err;
|
|
|
|
|
ssize_t rom_size;
|
|
|
|
|
|
|
|
|
|
struct pch_phub_reg *chip =
|
|
|
|
|
dev_get_drvdata(container_of(kobj, struct device, kobj));
|
|
|
|
@ -509,6 +515,10 @@ static ssize_t pch_phub_bin_read(struct file *filp, struct kobject *kobj,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Get Rom signature */
|
|
|
|
|
chip->pch_phub_extrom_base_address = pci_map_rom(chip->pdev, &rom_size);
|
|
|
|
|
if (!chip->pch_phub_extrom_base_address)
|
|
|
|
|
goto exrom_map_err;
|
|
|
|
|
|
|
|
|
|
pch_phub_read_serial_rom(chip, chip->pch_opt_rom_start_address,
|
|
|
|
|
(unsigned char *)&rom_signature);
|
|
|
|
|
rom_signature &= 0xff;
|
|
|
|
@ -539,10 +549,13 @@ static ssize_t pch_phub_bin_read(struct file *filp, struct kobject *kobj,
|
|
|
|
|
goto return_err;
|
|
|
|
|
}
|
|
|
|
|
return_ok:
|
|
|
|
|
pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);
|
|
|
|
|
mutex_unlock(&pch_phub_mutex);
|
|
|
|
|
return addr_offset;
|
|
|
|
|
|
|
|
|
|
return_err:
|
|
|
|
|
pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);
|
|
|
|
|
exrom_map_err:
|
|
|
|
|
mutex_unlock(&pch_phub_mutex);
|
|
|
|
|
return_err_nomutex:
|
|
|
|
|
return err;
|
|
|
|
@ -555,6 +568,7 @@ static ssize_t pch_phub_bin_write(struct file *filp, struct kobject *kobj,
|
|
|
|
|
int err;
|
|
|
|
|
unsigned int addr_offset;
|
|
|
|
|
int ret;
|
|
|
|
|
ssize_t rom_size;
|
|
|
|
|
struct pch_phub_reg *chip =
|
|
|
|
|
dev_get_drvdata(container_of(kobj, struct device, kobj));
|
|
|
|
|
|
|
|
|
@ -571,6 +585,12 @@ static ssize_t pch_phub_bin_write(struct file *filp, struct kobject *kobj,
|
|
|
|
|
goto return_ok;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
chip->pch_phub_extrom_base_address = pci_map_rom(chip->pdev, &rom_size);
|
|
|
|
|
if (!chip->pch_phub_extrom_base_address) {
|
|
|
|
|
err = -ENOMEM;
|
|
|
|
|
goto exrom_map_err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (addr_offset = 0; addr_offset < count; addr_offset++) {
|
|
|
|
|
if (PCH_PHUB_OROM_SIZE < off + addr_offset)
|
|
|
|
|
goto return_ok;
|
|
|
|
@ -585,10 +605,14 @@ static ssize_t pch_phub_bin_write(struct file *filp, struct kobject *kobj,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return_ok:
|
|
|
|
|
pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);
|
|
|
|
|
mutex_unlock(&pch_phub_mutex);
|
|
|
|
|
return addr_offset;
|
|
|
|
|
|
|
|
|
|
return_err:
|
|
|
|
|
pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);
|
|
|
|
|
|
|
|
|
|
exrom_map_err:
|
|
|
|
|
mutex_unlock(&pch_phub_mutex);
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
@ -598,8 +622,14 @@ static ssize_t show_pch_mac(struct device *dev, struct device_attribute *attr,
|
|
|
|
|
{
|
|
|
|
|
u8 mac[8];
|
|
|
|
|
struct pch_phub_reg *chip = dev_get_drvdata(dev);
|
|
|
|
|
ssize_t rom_size;
|
|
|
|
|
|
|
|
|
|
chip->pch_phub_extrom_base_address = pci_map_rom(chip->pdev, &rom_size);
|
|
|
|
|
if (!chip->pch_phub_extrom_base_address)
|
|
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
|
|
pch_phub_read_gbe_mac_addr(chip, mac);
|
|
|
|
|
pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);
|
|
|
|
|
|
|
|
|
|
return sprintf(buf, "%pM\n", mac);
|
|
|
|
|
}
|
|
|
|
@ -608,6 +638,7 @@ static ssize_t store_pch_mac(struct device *dev, struct device_attribute *attr,
|
|
|
|
|
const char *buf, size_t count)
|
|
|
|
|
{
|
|
|
|
|
u8 mac[6];
|
|
|
|
|
ssize_t rom_size;
|
|
|
|
|
struct pch_phub_reg *chip = dev_get_drvdata(dev);
|
|
|
|
|
|
|
|
|
|
if (count != 18)
|
|
|
|
@ -617,7 +648,12 @@ static ssize_t store_pch_mac(struct device *dev, struct device_attribute *attr,
|
|
|
|
|
(u32 *)&mac[0], (u32 *)&mac[1], (u32 *)&mac[2], (u32 *)&mac[3],
|
|
|
|
|
(u32 *)&mac[4], (u32 *)&mac[5]);
|
|
|
|
|
|
|
|
|
|
chip->pch_phub_extrom_base_address = pci_map_rom(chip->pdev, &rom_size);
|
|
|
|
|
if (!chip->pch_phub_extrom_base_address)
|
|
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
|
|
pch_phub_write_gbe_mac_addr(chip, mac);
|
|
|
|
|
pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);
|
|
|
|
|
|
|
|
|
|
return count;
|
|
|
|
|
}
|
|
|
|
@ -640,7 +676,6 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev,
|
|
|
|
|
int retval;
|
|
|
|
|
|
|
|
|
|
int ret;
|
|
|
|
|
ssize_t rom_size;
|
|
|
|
|
struct pch_phub_reg *chip;
|
|
|
|
|
|
|
|
|
|
chip = kzalloc(sizeof(struct pch_phub_reg), GFP_KERNEL);
|
|
|
|
@ -677,19 +712,7 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev,
|
|
|
|
|
"in pch_phub_base_address variable is %p\n", __func__,
|
|
|
|
|
chip->pch_phub_base_address);
|
|
|
|
|
|
|
|
|
|
if (id->driver_data != 3) {
|
|
|
|
|
chip->pch_phub_extrom_base_address =\
|
|
|
|
|
pci_map_rom(pdev, &rom_size);
|
|
|
|
|
if (chip->pch_phub_extrom_base_address == 0) {
|
|
|
|
|
dev_err(&pdev->dev, "%s: pci_map_rom FAILED", __func__);
|
|
|
|
|
ret = -ENOMEM;
|
|
|
|
|
goto err_pci_map;
|
|
|
|
|
}
|
|
|
|
|
dev_dbg(&pdev->dev, "%s : "
|
|
|
|
|
"pci_map_rom SUCCESS and value in "
|
|
|
|
|
"pch_phub_extrom_base_address variable is %p\n",
|
|
|
|
|
__func__, chip->pch_phub_extrom_base_address);
|
|
|
|
|
}
|
|
|
|
|
chip->pdev = pdev; /* Save pci device struct */
|
|
|
|
|
|
|
|
|
|
if (id->driver_data == 1) { /* EG20T PCH */
|
|
|
|
|
const char *board_name;
|
|
|
|
@ -763,6 +786,22 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev,
|
|
|
|
|
chip->pch_opt_rom_start_address =\
|
|
|
|
|
PCH_PHUB_ROM_START_ADDR_ML7223;
|
|
|
|
|
chip->pch_mac_start_address = PCH_PHUB_MAC_START_ADDR_ML7223;
|
|
|
|
|
} else if (id->driver_data == 5) { /* ML7831 */
|
|
|
|
|
retval = sysfs_create_file(&pdev->dev.kobj,
|
|
|
|
|
&dev_attr_pch_mac.attr);
|
|
|
|
|
if (retval)
|
|
|
|
|
goto err_sysfs_create;
|
|
|
|
|
|
|
|
|
|
retval = sysfs_create_bin_file(&pdev->dev.kobj, &pch_bin_attr);
|
|
|
|
|
if (retval)
|
|
|
|
|
goto exit_bin_attr;
|
|
|
|
|
|
|
|
|
|
/* set the prefech value */
|
|
|
|
|
iowrite32(0x000affaa, chip->pch_phub_base_address + 0x14);
|
|
|
|
|
/* set the interrupt delay value */
|
|
|
|
|
iowrite32(0x25, chip->pch_phub_base_address + 0x44);
|
|
|
|
|
chip->pch_opt_rom_start_address = PCH_PHUB_ROM_START_ADDR_EG20T;
|
|
|
|
|
chip->pch_mac_start_address = PCH_PHUB_MAC_START_ADDR_EG20T;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
chip->ioh_type = id->driver_data;
|
|
|
|
@ -773,8 +812,6 @@ exit_bin_attr:
|
|
|
|
|
sysfs_remove_file(&pdev->dev.kobj, &dev_attr_pch_mac.attr);
|
|
|
|
|
|
|
|
|
|
err_sysfs_create:
|
|
|
|
|
pci_unmap_rom(pdev, chip->pch_phub_extrom_base_address);
|
|
|
|
|
err_pci_map:
|
|
|
|
|
pci_iounmap(pdev, chip->pch_phub_base_address);
|
|
|
|
|
err_pci_iomap:
|
|
|
|
|
pci_release_regions(pdev);
|
|
|
|
@ -792,7 +829,6 @@ static void __devexit pch_phub_remove(struct pci_dev *pdev)
|
|
|
|
|
|
|
|
|
|
sysfs_remove_file(&pdev->dev.kobj, &dev_attr_pch_mac.attr);
|
|
|
|
|
sysfs_remove_bin_file(&pdev->dev.kobj, &pch_bin_attr);
|
|
|
|
|
pci_unmap_rom(pdev, chip->pch_phub_extrom_base_address);
|
|
|
|
|
pci_iounmap(pdev, chip->pch_phub_base_address);
|
|
|
|
|
pci_release_regions(pdev);
|
|
|
|
|
pci_disable_device(pdev);
|
|
|
|
@ -847,6 +883,7 @@ static struct pci_device_id pch_phub_pcidev_id[] = {
|
|
|
|
|
{ PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ROHM_ML7213_PHUB), 2, },
|
|
|
|
|
{ PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ROHM_ML7223_mPHUB), 3, },
|
|
|
|
|
{ PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ROHM_ML7223_nPHUB), 4, },
|
|
|
|
|
{ PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ROHM_ML7831_PHUB), 5, },
|
|
|
|
|
{ }
|
|
|
|
|
};
|
|
|
|
|
MODULE_DEVICE_TABLE(pci, pch_phub_pcidev_id);
|
|
|
|
@ -873,5 +910,5 @@ static void __exit pch_phub_pci_exit(void)
|
|
|
|
|
module_init(pch_phub_pci_init);
|
|
|
|
|
module_exit(pch_phub_pci_exit);
|
|
|
|
|
|
|
|
|
|
MODULE_DESCRIPTION("Intel EG20T PCH/OKI SEMICONDUCTOR IOH(ML7213/ML7223) PHUB");
|
|
|
|
|
MODULE_DESCRIPTION("Intel EG20T PCH/LAPIS Semiconductor IOH(ML7213/ML7223) PHUB");
|
|
|
|
|
MODULE_LICENSE("GPL");
|
|
|
|
|