summaryrefslogtreecommitdiffstats
path: root/build/ovs-dpdk-preconfig.yaml
blob: bfa0b174e9bbe307367a37a690730f9963fe0266 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
---
heat_template_version: 2014-10-16

description: >
  Example extra config for post-deployment

parameters:
  server:
    type: string
  HostCpusList:
    description: >
      List of logical cores for OVS DPDK
    type: string
    default: ""
  NeutronDpdkSocketMemory:
    description: Memory allocated for each socket
    default: ""
    type: string
  NeutronDpdkCoreList:
    description: >
      A list or range of physical CPU cores to be pinned to PMD
      The given args will be appended to the tuned cpu-partitioning profile.
      Ex. HostCpusList: '4-12' will tune cores from 4-12
    type: string
    default: ""

resources:
  OvsDpdkSetup:
    type: OS::Heat::StructuredDeployment
    properties:
      server: {get_param: server}
      config: {get_resource: OvsDpdkConfig}

  OvsDpdkConfig:
    type: OS::Heat::SoftwareConfig
    properties:
      group: script
      config:
        str_replace:
          template: |
            #!/bin/bash
            set -x
            get_mask()
            {
              local list=$1
              local mask=0
              declare -a bm
              max_idx=0
              for core in $(echo $list | sed 's/,/ /g')
              do
                  index=$(($core/32))
                  bm[$index]=0
                  if [ $max_idx -lt $index ]; then
                     max_idx=$index
                  fi
              done
              for ((i=$max_idx;i>=0;i--));
              do
                  bm[$i]=0
              done
              for core in $(echo $list | sed 's/,/ /g')
              do
                  index=$(($core/32))
                  temp=$((1<<$core))
                  bm[$index]=$((${bm[$index]} | $temp))
              done
              printf -v mask "%x" "${bm[$max_idx]}"
              for ((i=$max_idx-1;i>=0;i--));
              do
                  printf -v hex "%08x" "${bm[$i]}"
                  mask+=$hex
              done
              printf "%s" "$mask"
            }
            pmd_cpu_mask=$( get_mask $PMD_CORES )
            dpdk_lcore_mask=$( get_mask $DPDK_CORES )
            yum remove -y vpp-devel
            yum install -y /root/dpdk_rpms/*
            systemctl restart openvswitch
            sleep 5
            sed  -i "s/#user\s*=.*/user = \"root\"/" /etc/libvirt/qemu.conf
            sed  -i "s/#group\s*=.*/group = \"root\"/" /etc/libvirt/qemu.conf
            ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
            if [ -n "$SOCKET_MEMORY" ]; then
              other_config="dpdk-socket-mem=$SOCKET_MEMORY"
              ovs-vsctl --no-wait set Open_vSwitch . other_config:$other_config
            fi
            if [ -n "$pmd_cpu_mask" ]; then
              other_config="pmd-cpu-mask=$pmd_cpu_mask"
              ovs-vsctl --no-wait set Open_vSwitch . other_config:$other_config
            fi
            if [ -n "$dpdk_lcore_mask" ]; then
              other_config="dpdk-lcore-mask=$dpdk_lcore_mask"
              ovs-vsctl --no-wait set Open_vSwitch . other_config:$other_config
            fi
            systemctl restart openvswitch

          params:
            $DPDK_CORES: {get_param: HostCpusList}
            $PMD_CORES: {get_param: NeutronDpdkCoreList}
            $SOCKET_MEMORY: {get_param: NeutronDpdkSocketMemory}
outputs:
  deploy_stdout:
    description: Output of the extra dpdk ovs  deployment
    value: {get_attr: [OvsDpdkSetup, deploy_stdout]}
span class="n">time = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; rtc_time_to_tm(time, tm); dev_dbg(&client->dev, "%s: tm is secs=%d, mins=%d, hours=%d, " "mday=%d, mon=%d, year=%d, wday=%d\n", __func__, tm->tm_sec, tm->tm_min, tm->tm_hour, tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday); return 0; } static int ds1672_set_mmss(struct i2c_client *client, unsigned long secs) { int xfer; unsigned char buf[6]; buf[0] = DS1672_REG_CNT_BASE; buf[1] = secs & 0x000000FF; buf[2] = (secs & 0x0000FF00) >> 8; buf[3] = (secs & 0x00FF0000) >> 16; buf[4] = (secs & 0xFF000000) >> 24; buf[5] = 0; /* set control reg to enable counting */ xfer = i2c_master_send(client, buf, 6); if (xfer != 6) { dev_err(&client->dev, "%s: send: %d\n", __func__, xfer); return -EIO; } return 0; } static int ds1672_rtc_read_time(struct device *dev, struct rtc_time *tm) { return ds1672_get_datetime(to_i2c_client(dev), tm); } static int ds1672_rtc_set_mmss(struct device *dev, unsigned long secs) { return ds1672_set_mmss(to_i2c_client(dev), secs); } static int ds1672_get_control(struct i2c_client *client, u8 *status) { unsigned char addr = DS1672_REG_CONTROL; struct i2c_msg msgs[] = { {/* setup read ptr */ .addr = client->addr, .len = 1, .buf = &addr }, {/* read control */ .addr = client->addr, .flags = I2C_M_RD, .len = 1, .buf = status }, }; /* read control register */ if ((i2c_transfer(client->adapter, &msgs[0], 2)) != 2) { dev_err(&client->dev, "%s: read error\n", __func__); return -EIO; } return 0; } /* following are the sysfs callback functions */ static ssize_t show_control(struct device *dev, struct device_attribute *attr, char *buf) { struct i2c_client *client = to_i2c_client(dev); u8 control; int err; err = ds1672_get_control(client, &control); if (err) return err; return sprintf(buf, "%s\n", (control & DS1672_REG_CONTROL_EOSC) ? "disabled" : "enabled"); } static DEVICE_ATTR(control, S_IRUGO, show_control, NULL); static const struct rtc_class_ops ds1672_rtc_ops = { .read_time = ds1672_rtc_read_time, .set_mmss = ds1672_rtc_set_mmss, }; static int ds1672_probe(struct i2c_client *client, const struct i2c_device_id *id) { int err = 0; u8 control; struct rtc_device *rtc; dev_dbg(&client->dev, "%s\n", __func__); if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) return -ENODEV; dev_info(&client->dev, "chip found, driver version " DRV_VERSION "\n"); rtc = devm_rtc_device_register(&client->dev, ds1672_driver.driver.name, &ds1672_rtc_ops, THIS_MODULE); if (IS_ERR(rtc)) return PTR_ERR(rtc); i2c_set_clientdata(client, rtc); /* read control register */ err = ds1672_get_control(client, &control); if (err) { dev_warn(&client->dev, "Unable to read the control register\n"); } if (control & DS1672_REG_CONTROL_EOSC) dev_warn(&client->dev, "Oscillator not enabled. " "Set time to enable.\n"); /* Register sysfs hooks */ err = device_create_file(&client->dev, &dev_attr_control); if (err) dev_err(&client->dev, "Unable to create sysfs entry: %s\n", dev_attr_control.attr.name); return 0; } static struct i2c_device_id ds1672_id[] = { { "ds1672", 0 }, { } }; MODULE_DEVICE_TABLE(i2c, ds1672_id); static struct i2c_driver ds1672_driver = { .driver = { .name = "rtc-ds1672", }, .probe = &ds1672_probe, .id_table = ds1672_id, }; module_i2c_driver(ds1672_driver); MODULE_AUTHOR("Alessandro Zummo <a.zummo@towertech.it>"); MODULE_DESCRIPTION("Dallas/Maxim DS1672 timekeeper driver"); MODULE_LICENSE("GPL"); MODULE_VERSION(DRV_VERSION);