blob: ac49df30482647e262a70e7657d9409b551a9b79 [file] [log] [blame]
uwe43ffab82009-09-02 23:27:45 +00001/*
2 * This file is part of the flashrom project.
3 *
uwe7d32d0f2009-09-09 00:55:13 +00004 * Copyright (C) 2009 Joerg Fischer <turboj@web.de>
uwe43ffab82009-09-02 23:27:45 +00005 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
uwe43ffab82009-09-02 23:27:45 +000015 */
16
17#include <stdlib.h>
uwe43ffab82009-09-02 23:27:45 +000018#include "flash.h"
hailfinger428f6852010-07-27 22:41:39 +000019#include "programmer.h"
Patrick Georgib6e26e62017-04-11 20:24:22 +020020#include "hwaccess.h"
uwe43ffab82009-09-02 23:27:45 +000021
22#define PCI_VENDOR_ID_DRKAISER 0x1803
23
24#define PCI_MAGIC_DRKAISER_ADDR 0x50
25#define PCI_MAGIC_DRKAISER_VALUE 0xa971
26
dhendrix0ffc2eb2011-06-14 01:35:36 +000027#define DRKAISER_MEMMAP_SIZE (1024 * 128)
28
hailfinger69422b82010-07-17 22:42:33 +000029/* Mask to restrict flash accesses to the 128kB memory window. */
30#define DRKAISER_MEMMAP_MASK ((1 << 17) - 1)
31
Patrick Georgi8ae16572017-03-09 15:59:25 +010032const struct dev_entry drkaiser_pcidev[] = {
mkarcher6475d3f2010-02-24 00:04:40 +000033 {0x1803, 0x5057, OK, "Dr. Kaiser", "PC-Waechter (Actel FPGA)"},
Patrick Georgie39d6442017-03-22 21:23:35 +010034
Patrick Georgi8ddfee92017-03-20 14:54:28 +010035 {0},
uwe43ffab82009-09-02 23:27:45 +000036};
37
hailfinger1ff33dc2010-07-03 11:02:10 +000038static uint8_t *drkaiser_bar;
uwe43ffab82009-09-02 23:27:45 +000039
Souvik Ghoshd75cd672016-06-17 14:21:39 -070040static void drkaiser_chip_writeb(const struct flashctx *flash, uint8_t val,
41 chipaddr addr);
42static uint8_t drkaiser_chip_readb(const struct flashctx *flash,
43 const chipaddr addr);
Patrick Georgi0a9533a2017-02-03 19:28:38 +010044static const struct par_master par_master_drkaiser = {
hailfinger76bb7e92011-11-09 23:40:00 +000045 .chip_readb = drkaiser_chip_readb,
46 .chip_readw = fallback_chip_readw,
47 .chip_readl = fallback_chip_readl,
48 .chip_readn = fallback_chip_readn,
49 .chip_writeb = drkaiser_chip_writeb,
50 .chip_writew = fallback_chip_writew,
51 .chip_writel = fallback_chip_writel,
52 .chip_writen = fallback_chip_writen,
53};
54
David Hendricksac1d25c2016-08-09 17:00:58 -070055int drkaiser_init(void)
uwe43ffab82009-09-02 23:27:45 +000056{
Patrick Georgi7c30fa92017-03-28 22:47:12 +020057 struct pci_dev *dev = NULL;
uwe43ffab82009-09-02 23:27:45 +000058 uint32_t addr;
59
Patrick Georgi2a2d67f2017-03-09 10:15:39 +010060 if (rget_io_perms())
61 return 1;
hailfinger1ef766d2010-07-06 09:55:48 +000062
Patrick Georgi7c30fa92017-03-28 22:47:12 +020063 dev = pcidev_init(drkaiser_pcidev, PCI_BASE_ADDRESS_2);
64 if (!dev)
65 return 1;
66
67 addr = pcidev_readbar(dev, PCI_BASE_ADDRESS_2);
68 if (!addr)
69 return 1;
uwe43ffab82009-09-02 23:27:45 +000070
71 /* Write magic register to enable flash write. */
Patrick Georgid490a172017-03-28 23:03:47 +020072 rpci_write_word(dev, PCI_MAGIC_DRKAISER_ADDR, PCI_MAGIC_DRKAISER_VALUE);
uwe43ffab82009-09-02 23:27:45 +000073
stefanct707f13b2011-05-19 02:58:17 +000074 /* Map 128kB flash memory window. */
Patrick Georgi124bd002017-03-21 17:25:59 +010075 drkaiser_bar = rphysmap("Dr. Kaiser PC-Waechter flash memory", addr, DRKAISER_MEMMAP_SIZE);
76 if (drkaiser_bar == ERROR_PTR)
dhendrix0ffc2eb2011-06-14 01:35:36 +000077 return 1;
hailfinger76bb7e92011-11-09 23:40:00 +000078
79 max_rom_decode.parallel = 128 * 1024;
Patrick Georgi0a9533a2017-02-03 19:28:38 +010080 register_par_master(&par_master_drkaiser, BUS_PARALLEL);
hailfinger76bb7e92011-11-09 23:40:00 +000081
uwe43ffab82009-09-02 23:27:45 +000082 return 0;
83}
84
Patrick Georgid4caa6b2017-03-28 21:22:55 +020085static void drkaiser_chip_writeb(const struct flashctx *flash, uint8_t val,
86 chipaddr addr)
uwe43ffab82009-09-02 23:27:45 +000087{
hailfinger2df6f3e2010-07-27 22:03:46 +000088 pci_mmio_writeb(val, drkaiser_bar + (addr & DRKAISER_MEMMAP_MASK));
uwe43ffab82009-09-02 23:27:45 +000089}
90
Patrick Georgid4caa6b2017-03-28 21:22:55 +020091static uint8_t drkaiser_chip_readb(const struct flashctx *flash,
92 const chipaddr addr)
uwe43ffab82009-09-02 23:27:45 +000093{
hailfinger2df6f3e2010-07-27 22:03:46 +000094 return pci_mmio_readb(drkaiser_bar + (addr & DRKAISER_MEMMAP_MASK));
uwe43ffab82009-09-02 23:27:45 +000095}