22c21003a9
Lemote Loongson 2F family machines use CS5536 as their south bridge and need these lowlevel interfaces to access the devices on CS5536. Virtualize the legacy devices on CS5536 as PCI devices. This way users can access the CS5536 PCI config space directly as a normal multi-function PCI 2.2 device. Signed-off-by: Wu Zhangjin <wuzhangjin@gmail.com> Cc: zhangfx@lemote.com Cc: yanh@lemote.com Cc: huhb@lemote.com Cc: Nicholas Mc Guire <hofrat@hofr.at> Cc: Arnaud Patard <apatard@mandriva.com> Cc: loongson-dev@googlegroups.com Cc: linux-mips@linux-mips.org Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
87 lines
2.2 KiB
C
87 lines
2.2 KiB
C
/*
|
|
* read/write operation to the PCI config space of CS5536
|
|
*
|
|
* Copyright (C) 2007 Lemote, Inc.
|
|
* Author : jlliu, liujl@lemote.com
|
|
*
|
|
* Copyright (C) 2009 Lemote, Inc.
|
|
* Author: Wu Zhangjin, wuzj@lemote.com
|
|
*
|
|
* 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 the
|
|
* Free Software Foundation; either version 2 of the License, or (at your
|
|
* option) any later version.
|
|
*
|
|
* the Virtual Support Module(VSM) for virtulizing the PCI
|
|
* configure space are defined in cs5536_modulename.c respectively,
|
|
*
|
|
* after this virtulizing, user can access the PCI configure space
|
|
* directly as a normal multi-function PCI device which follows
|
|
* the PCI-2.2 spec.
|
|
*/
|
|
|
|
#include <linux/types.h>
|
|
#include <cs5536/cs5536_vsm.h>
|
|
|
|
enum {
|
|
CS5536_FUNC_START = -1,
|
|
CS5536_ISA_FUNC,
|
|
reserved_func,
|
|
CS5536_IDE_FUNC,
|
|
CS5536_ACC_FUNC,
|
|
CS5536_OHCI_FUNC,
|
|
CS5536_EHCI_FUNC,
|
|
CS5536_FUNC_END,
|
|
};
|
|
|
|
static const cs5536_pci_vsm_write vsm_conf_write[] = {
|
|
[CS5536_ISA_FUNC] pci_isa_write_reg,
|
|
[reserved_func] NULL,
|
|
[CS5536_IDE_FUNC] pci_ide_write_reg,
|
|
[CS5536_ACC_FUNC] pci_acc_write_reg,
|
|
[CS5536_OHCI_FUNC] pci_ohci_write_reg,
|
|
[CS5536_EHCI_FUNC] pci_ehci_write_reg,
|
|
};
|
|
|
|
static const cs5536_pci_vsm_read vsm_conf_read[] = {
|
|
[CS5536_ISA_FUNC] pci_isa_read_reg,
|
|
[reserved_func] NULL,
|
|
[CS5536_IDE_FUNC] pci_ide_read_reg,
|
|
[CS5536_ACC_FUNC] pci_acc_read_reg,
|
|
[CS5536_OHCI_FUNC] pci_ohci_read_reg,
|
|
[CS5536_EHCI_FUNC] pci_ehci_read_reg,
|
|
};
|
|
|
|
/*
|
|
* write to PCI config space and transfer it to MSR write.
|
|
*/
|
|
void cs5536_pci_conf_write4(int function, int reg, u32 value)
|
|
{
|
|
if ((function <= CS5536_FUNC_START) || (function >= CS5536_FUNC_END))
|
|
return;
|
|
if ((reg < 0) || (reg > 0x100) || ((reg & 0x03) != 0))
|
|
return;
|
|
|
|
if (vsm_conf_write[function] != NULL)
|
|
vsm_conf_write[function](reg, value);
|
|
}
|
|
|
|
/*
|
|
* read PCI config space and transfer it to MSR access.
|
|
*/
|
|
u32 cs5536_pci_conf_read4(int function, int reg)
|
|
{
|
|
u32 data = 0;
|
|
|
|
if ((function <= CS5536_FUNC_START) || (function >= CS5536_FUNC_END))
|
|
return 0;
|
|
if ((reg < 0) || ((reg & 0x03) != 0))
|
|
return 0;
|
|
if (reg > 0x100)
|
|
return 0xffffffff;
|
|
|
|
if (vsm_conf_read[function] != NULL)
|
|
data = vsm_conf_read[function](reg);
|
|
|
|
return data;
|
|
}
|